问题:有一个大小为n的数组,求其中第k大的数。
这里采用快速排序思想,将数组进行划分 ,该算法时间复杂度为O(n)。
#include<iostream> #include<time.h> #include<stdlib.h> using namespace std; int random_partion(int *arry,int n) { time_t t; srand((unsigned)time(&t)); int index=rand()%n; swap(arry[index],arry[n-1]); //起到随机效果 int i=-1; //i指向小于p[n-1]的元素的位置 int j=0; while(j<n) { //将大于p[n-1]的数交换到前半部分 if(arry[j]>arry[n-1]) { swap(arry[++i],arry[j]); } j++; } swap(arry[++i],arry[n-1]); return i; } int getKMax(int *arry,int n,int k) { int pos; if(k<=0) return -1; if(k>n) return -1; pos=random_partion(arry,n); //对原数组进行划分 if(pos == k-1) //如果pos+1==k,那么返回该值,这就是第k大的数 return arry[pos]; else if(pos<k-1) return getKMax(arry+pos+1,n-pos-1,k-pos-1); else return getKMax(arry,pos,k); } int main() { int arry[] = {543,56,6435,965,561,555,604,21,546,844,68}; int k; cout<<"input k:"; cin>>k; cout<<getKMax(arry,11,k)<<endl; system("pause"); return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。