运用快速排序的思想解决问题
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SWAP(X,Y) {int temp;temp=X;X=Y;Y=temp;}
//快速排序的划分函数
int partition(int a[],int l,int r)
{
int i,j,x;
srand((unsigned)time(NULL));//初始化随机数
i=l+rand()%(r-l+1);
SWAP(a[i],a[l]);
i=l;
j = r+1;
x = a[l];
while (1)
{
while(a[++i] > x);
while(a[--j] < x);
if(i >= j) break;
SWAP(a[i],a[j]);
}
a[l] = a[j];
a[j] = x;
return j;
}
//线性寻找第k大的数
int select_K(int a[],int l,int r,int k)
{
int i,j;
if (l == r) //递归结束
return a[l];
i =partition(a,l,r);//划分
j = i-l+1;
if(k == j) //递归结束,找到第K大的数
return a[i];
if(k < j)
{
return select_K(a,l,i-1,k);//递归调用,在前面部分查找第K大的数
}
else
return select_K(a,i+1,r,k-j);//递归调用,在后面部分查找第K大的数
}
int main()
{
int a[]={2,1,10,8,3,4,6,6,7,9};
printf("%d ",select_K(a,0,9,8));
return 0;
}