寻找第K大的数(快排思想)
2016-04-15 22:27
344 查看
使用快排思想找第K大的数,算法复杂度O(n)。
1.以数组a的第0位a[0]为参考基准base,将数组划分为两个部分;
如果找第K大的数,则将大于base的数往前挪,将小于base的数往后挪。如果找第K小的数,则与此相反。
划分过程与快排相同,使用两个指针i和j分别指向数组的首尾,根据指针所指元素与基准base的大小交替移动两个指针,直到两个指针指向同一个位置i==j,此时i或j即为base的下标.
2.当K-1大于base的索引i(或j)时,所要找的第K大的数位于base的后半部分,需要对后半部分进行排序,而不用管前半部分的顺序;
当K-1小于base的索引时,所要找的第K大的数位于base的前半部分,只需要对前半部分进行排序;
当K-1等于base的索引时,说明当前的base就是所要找的第K大的数。
使用递归方法对所需要排序的部分进行排序。
1.以数组a的第0位a[0]为参考基准base,将数组划分为两个部分;
如果找第K大的数,则将大于base的数往前挪,将小于base的数往后挪。如果找第K小的数,则与此相反。
划分过程与快排相同,使用两个指针i和j分别指向数组的首尾,根据指针所指元素与基准base的大小交替移动两个指针,直到两个指针指向同一个位置i==j,此时i或j即为base的下标.
2.当K-1大于base的索引i(或j)时,所要找的第K大的数位于base的后半部分,需要对后半部分进行排序,而不用管前半部分的顺序;
当K-1小于base的索引时,所要找的第K大的数位于base的前半部分,只需要对前半部分进行排序;
当K-1等于base的索引时,说明当前的base就是所要找的第K大的数。
使用递归方法对所需要排序的部分进行排序。
#include <iostream> #include <vector> using namespace std; // 找第K小的数 void findKthSmaller(vector<int> &a, int K, int m,int n) { int base=a[m]; int i=m,j=n; while(i<j){ while(i<j && a[j]>=base){ --j; } if(a[j]<base){ a[i++]=a[j]; } while(i<j && a[i]<base){ ++i; } if(a[i]>=base){ a[j--]=a[i]; } } a[i]=base; if(K-1<i){ findKthSmaller(a,K,m,i-1); } else if(K-1>i){ findKthSmaller(a,K,i+1,n); } else return; } // 找第K大的数 // m,n表示所需要排序部分的首尾索引 void findKthBigger(vector<int> &a, int K, int m,int n) { int i=m,j=n; int base = a[i]; while(i<j){ while(i<j && a[j]<base){ --j; } if(i<j) a[i++] = a[j]; while(i<j && a[i]>=base){ ++i; } if(i<j){ a[j--] = a[i]; } } a[i] = base; if(K-1 > i){ findKthBigger(a,K,i+1,n); } if(K-1 < i){ findKthBigger(a,K,m,i-1); } else return; } int main() { vector<int> a;int n=10; int K=7; // 8 4 6 9 2 3 7 9 11 10 for(int i=0;i<n;++i){ int tmp; cin >> tmp; a.push_back(tmp); } findKthBigger(a,K,0,n-1); for(int i=0;i<n;++i){ cout<<a[i]<<" "; } cout << endl; cout<< a[K-1] << endl; return 0; }
相关文章推荐
- conflicts with file from package mariadb-libs
- Python 练习实例20
- 【BFS】POJ 3278
- Node.js学习 - Event Loop
- 【数据库】Oracle数据库----对象视图
- 软件过程与项目管理(第七周作业)
- CodeForces 660 B. Seating On Bus【模拟】
- 进程管理
- 每天一个设计模式之装饰者模式
- request.setAttribute()的用法
- POJ 3984 迷宫问题(BFS)
- 使用文件流ADS 及 JavaScript 进行钓鱼攻击
- 20145210 《Java程序设计》第07周学习总结
- C++实践参考:数组作数据成员
- 字符串处理之字符串流的创建
- Altium Designer原理图放置差分信号
- 设置应用栏(Setting Up the App Bar)
- T-SQL:表的创建和管理
- Google Best reports series - Account Recovery XSS 过程分析
- 教你快速把项目提交到github或者oschina中去或者快速把网上的项目下载下来并可控制版本