给出一个数组,要求查找出这个数组中按顺序排第K大的数字。
思路:利用快速排序的思想,把数组中的元素分治,并计算中间值的位置,如果是K,则这个数就是第K大的数字,如果比K小,那么再次利用快速排序分治中值 以后的数据,如果比K大,则排序前面的数字,直到找到K的位置。
下面给出C++实现的代码:
#include <cstdlib>
#include <iostream>
using namespace std;
int partition(int data[],int first,int last) //¿ìËÙÅÅÐòµÄ·Öλ
{
int pivot=data[first];
while(first<last)
{
while(first<last&&data[last]>pivot)
last--; data[first]=data[last];
while(first<last&&data[first]<pivot)
first++; data[last]=data[first];
}
data[first]=pivot;
return first;
}
int findKth(int data[],int first,int last,int k)
{
int kth;
if(first==last) kth=data[first];
else
{
int pivot=data[first]; //Ïȸø¼Ç¼ÏÂÀ´
int splitPoint=partition(data,first,last); //ÕâÊÇÿһ´Î·Ö¸îµÄµãλ
if(k<splitPoint)
kth=findKth(data,first,splitPoint-1,k);
else
if(k>splitPoint)
kth=findKth(data,splitPoint+1,last,k);
else
kth=pivot;
}
return kth;
}
int main(int argc, char *argv[])
{
int a[11]={-1,11,17,18,5,7,14,9,6,27,21};
//ÕýÈ·µÄ˳ÐòÊÇ£º5,6,7,9,11,14,17,18,21,27
int t=findKth(a,1,10,6);
cout<<t<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
本文介绍了一种使用快速排序思想查找数组中第K大元素的方法。通过递归地将数组分为两部分并确定基准元素的位置,可以有效地定位到目标元素。文章提供了详细的C++实现代码。
456

被折叠的 条评论
为什么被折叠?



