#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string>
#include <string.h>
using namespace std; const int nMax = ;
int A[nMax+];
int B[nMax+];//用来每次5分法后保存要比较的值在A中的下标
int AIndex[nMax+]; //用来保存A的初始化下标 //通过插入排序获取中位数下标
int InsertSort(int A[], int B[], int start, int end)
{
if (start == end)
{
return B[start];
} for (int i = start+; i <= end; ++i)
{
int num = A[B[i]];
int j = i-;
for ( ; j >= start; --j)
{
if (num < A[B[j]])
{
A[B[j + ]] = A[B[j]];
}
else
{
break;
}
}
A[B[j + ]] = num;
} return B[(start + end)/];
} //获取中位数的中位数的下标
int GetMidMid(int A[], int AIndex[], int k, int n)
{
if (k == n)
{
return AIndex[n];
} int len_s = n - k + ;
//筛选出n/5份的中位数
int mod = len_s % ;
int len = len_s / + (mod != );
for (int i = , j = k; i<= len && j <= n-mod; ++i, j+=)
{
B[i] = InsertSort(A, AIndex,j, j+);
}
if (mod != )
{
B[len] = InsertSort(A, AIndex, n - mod + , n);
}
return GetMidMid(A, B, , len);
} //原址排序
int Partition(int A[], int p, int n)
{
int pivot = A[n];
int j = p - ;
for (int i = p; i <= n - ; ++i)
{
if (A[i] <= pivot)
{
j++;
swap(A[j], A[i]);
}
} swap(A[j + ], A[n]);
return j + ;
} int Select(int A[], int k, int n, int i)
{
if (k == n)
{
return A[n];
} int midValueIndex = GetMidMid(A, AIndex, k, n); //将该中位数作为主元(pivot element)
//使用一次原址重排
int pivot = A[midValueIndex];
swap(A[midValueIndex], A[n]);
int mid = Partition(A, k, n); int t = mid - k + ;
if (i == t)
{
return A[mid];
}
else if (i < t)
{
return Select(A, k, mid-, i);
}
else
{
return Select(A, mid+, n, i-t);
}
}
int main(int argc, char** argv)
{
int n = ;
for (int i = ; i <= n; ++i)
{
A[i] = i;
AIndex[i] = i;
} //for (int i = 1; i <= n; ++i)
//{
// cout << A[i] << " ";
//}
//cout << endl; int equalNum = ;
for (int i = ; i <= n; ++i)
{
//随机排列A数组
for (int i = ; i <= n; ++i)
{
int j = i + rand() % nMax;
//swap(A[i], A[j]);
A[i] = j;
} int ans1 = Select(A, , n, i);
sort(A + , A + n + );
int ans2 = A[i]; if (ans1 == ans2)
{
equalNum++;
}
}
cout << n << " " << equalNum << endl;
return ;
}

Select算法(最坏复杂度O(n))的更多相关文章

  1. 重拾算法之复杂度分析(大O表示法)

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  2. 数据结构与算法 java描述 第一章 算法及其复杂度

    目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...

  3. 【Unsolved】线性时间选择算法的复杂度证明

    线性时间选择算法中,最坏情况仍然可以保持O(n). 原因是通过对中位数的中位数的寻找,保证每次分组后,任意一组包含元素的数量不会大于某个值. 普通的Partition最坏情况下,每次只能排除一个元素, ...

  4. 浅谈压缩感知(二十七):压缩感知重构算法之稀疏度自适应匹配追踪(SAMP)

    主要内容: SAMP的算法流程 SAMP的MATLAB实现 一维信号的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.SAMP的算法流程 前面所述大部分OMP及其前改算法都需要已知信号的稀疏度 ...

  5. 算法最坏,平均和最佳情况(Worst, Average and Best Cases)-------geeksforgeeks 翻译

    最坏,平均和最佳运行时间(Worst, Average and Best Cases) 在上一篇文章中,我们讨论到了渐进分析可以解决分析算法的问题,那么在这一篇中,我们用线性搜索来举例说明一下如何用渐 ...

  6. C++:主要几种排序算法及其复杂度

     常见排序算法稳定性和复杂度分析快速简记以及转载 分类: 算法 2012-02-07 22:18 399人阅读 评论(1) 收藏 举报 算法mergeshell http://blogold.chin ...

  7. 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。

    有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M. 需要选出若干个x,使这几个x的和与 M 最接近. 请描述实现算法,并指出算法复杂度. #define M 8 ...

  8. C++ STL标准容器插入删除算法的复杂度

    1 vector内部实现: 数组 // 就是没有固定大小的数组,vector直接翻译是向量的意思支持操作:begin(), //取首个元素,返回一个iteratorend(), //取末尾(最后一个元 ...

  9. Fast Newman-FN算法以及模块度定义介绍

    一.社区的定义 Newman第一次提出模块度定义就是在2004年发表的这篇文章“fast algorithm for community structure in networks”,第一次用量化的公 ...

随机推荐

  1. Swift中格式化日期

    Swift语言中格式化日期跟其它编程语言很相似: var dformatter = NSDateFormatter() dformatter.dateFormat = "yyyy年MM月dd ...

  2. Mac 活动监视器 闪退 pro发热耗电过快问题解决,亲测可用解决

    该解决办法转载 Mac 活动监视器 闪退 pro发热耗电过快问题解决 这个月新买了mac,升级了系统,出现CPU发热,高负荷运转问题,始终找不到问题解决办法, ,这个过程太痛苦了,也不知道是什么原因. ...

  3. c++  与  java  中的 继承

    C++ 代码: #include <iostream> #include <string> using namespace std; class Parent { public ...

  4. mkbootimg hacking

    /********************************************************************** * mkbootimg hacking * 声明: * ...

  5. HDU1081 最大字段和 压缩数组(单调队列优化)

    最大字段和题型,推荐做题顺序: HDU1003 HDU1024 HDU1081  ZOJ2975 ZOJ2067 #include<cstdio> #include<cstdlib& ...

  6. 【poj3169】【差分约束+spfa】

    题目链接http://poj.org/problem?id=3169 题目大意: 一些牛按序号排成一条直线. 有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没 ...

  7. echar生成雷达图

    function createRadarChart(indicatorData, personData) { var myChart = echarts.init(document.getElemen ...

  8. MySQL Transaction--事务隔离级别基础

    MYSQL 支持的事务隔离级别 REPEATABLE READ READ COMMITTED READ UNCOMMITTED SERIALIZABLE InnoDB 默认使用REPEATABLE R ...

  9. 4.图像sensor的特性和驱动解析

    修改 摄像头SDK中支持的sensor需要做的事 例如:ar0130 --> ov9712 1.修改加载load3518e脚本的参数 vi /etc/profile ./load3518e -i ...

  10. Oracle ADDM性能诊断利器及报告解读

    性能优化是一个永恒的话题,性能优化也是最具有价值,最值得花费精力深入研究的一个课题,因为资源是有限的,时间是有限的.在Oracle数据库中,随着Oracle功能的不断强大和完善,Oralce数据库在性 ...