取n个数中第k大数
发布时间:2020-12-14 01:41:20 所属栏目:大数据 来源:网络整理
导读:问题:有一个大小为n的数组,求其中第k大的数。 这里采用快速排序思想,将数组进行划分 ,该算法时间复杂度为O(n)。 #includeiostream#includetime.h#includestdlib.husing namespace std;int random_partion(int *arry,int n){ time_t t; srand((unsigned)t
|
问题:有一个大小为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;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
