设为首页 - 加入收藏 PHP编程网 - PHP站长网 (http://www.52php.cn)- 电商,百科,编程,业界,移动互联,5G,云计算,站长网!
热搜: 娱乐 服务 专业 百度
当前位置: 首页 > 大数据 > 正文

取n个数中第k大数

发布时间:2021-01-24 03:39 所属栏目:[大数据] 来源:网络整理
导读:问题:有一个大小为n的数组,求其中第k大的数。 这里采用快速排序思想,将数组进行划分 ,该算法时间复杂度为O(n)。 #includeiostream#includetime.h#includestdlib.husing namespace std;int random_partion(int *arry,int n){ time_t t; srand((unsigned

问题:有一个大小为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;
}

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

推荐文章
热点阅读