思路:
快速排序是一种分治策略,通常以当前表头元素为基准值(下标mid),每一次排序都会把基准值排在最后的位置上,即确定为第n-mid大的元素(顺序),且会把当前表 左右划分 为小于和大于该基准值的两个子表。再重复上述方法对左右子表排序即可获得有序表。
可以看到每次排序都会得到一个基准值,而要找的元素为基准值的下标为 k (n-K)的元素。由于快排基准值划分左右子表的特性,可以把查找基准值的过程视为二分查找的过程。
代码:
int res=-1; int part(int *a,int low,int high){//确定基准值 int pos=a[low]; while(low<high){ while(low<high && a[high]>=pos) high--; a[low]=a[high]; while(low<high && a[low]<=pos) low++; a[high]=a[low]; } a[low]=pos; return low; } void my_qsort(int *a,int low,int high,int k){//快排 int mid=part(a,low,high); if(mid==k) res=a[mid];//如果当前基准值下标与k对应,得到第K大元素 else if(mid<k) my_qsort(a,mid+1,high,k);//在右子表寻找 else my_qsort(a,low,mid-1,k);//在左子表寻找 } int findKth(int* a, int aLen, int n, int K ) { // write code here my_qsort(a,0,n-1,n-K); return res; }