线性时间选择第k小(递归)
2016-12-28 19:49
337 查看
利用O(N)时间选择第k小,思路是五个一组,找到五个的中位数,再在中位数里找中位数,作为partition的pivot;
#include<iostream> #include<cstdlib> #include<algorithm> using namespace std; const int N=50000;//数组大小 int a ; int ppartition(int p,int r,int x) { //int x=a[p]; int i=p,j=r+1; while(1) { while(a[++i]<x&&i<r); while(a[--j]>x); if(i>=j)break; swap(a[i],a[j]); } //a[p]=a[j]; // a[j]=x; return j; } int Select(int p,int r,int k){ if(r-p<75){ sort(a,a+N); return a[p+k-1]; } for(int i=0;i<=(r-p-4)/5;i++){ sort(a+p+5*i,a+p+5*i+5); swap(a[p+i],a[p+5*i+2]); } int x=Select(p,p+(r-p-4)/5,(r-p-4)/10); int i=ppartition(p,r,x);int j=i-p+1; if(k<=j)return Select(p,i,k); else return Select(i+1,r,k-j); } int main() { for(int i=0;i<N;i++)a[i]=i+1; cout<<"请选择要输出的第k小的数字:"<<endl; int k;cin>>k; int ans=Select(0,N-1,k); cout<<ans<<endl; return 0; }
相关文章推荐
- 递归与分治策略-2.9.1线性时间选择(随机划分基准)(第k小问题)
- 线性时间选择问题-第k小(大)问题-递归与分治
- [置顶] 递归与分治策略-2.9.2线性时间选择(取中位数的中位数基准)(第k小问题)
- 选择问题:线性时间内找到序列的第k小的元素
- 快速选择(quick select) + 线性时间选择(linear-time select) - 求出n个数中第k大的数
- 递归与分治策略之线性选择(第k小元素)
- 分治算法:线性时间选择第k大小的数字 && STL函数:nth_element()
- 递归与分治策略之线性时间选择(随机划分线性选择)
- 分治算法;随机化划分函数;快速排序;线性时间选择第K小元素;快速排序平均时间复杂度nlgn;
- 线性时间选择第K小元素(随机化选择第K小元素)C++
- 快速选择(quick select) + 线性时间选择(linear-time select) - 求出n个数中第k大的数
- 线性时间选择:从n个元素中找出第k小的元素
- 算法导论--选择第k小的数字,期望时间为n
- 0006算法笔记——【分治法】线性时间选择
- 最坏情况下的线性时间的选择算法
- 算法探究:线性时间选择问题
- 最差情况为线性时间的选择
- 线性时间选择
- 线性时间选择
- 最坏情况为线性时间的选择算法---算法导论学习笔记(2)