题目描述:
试编写一个算法,使之能够在 数组L【1…n】中找到第k小的元素(即从小到大排序后存储于第k个位置的元素)。
算法思想:
利用快速排序,在数组L【1…n】中选择枢轴pivot(随机或者取第一个)进行和快速排序一样的划分操作,表L【1…n】被划分为L【1…m-1】和L【m+1…n】,其中L(m)=pivot。
- 当m=k时,显然,此时pivot就是要找的元素,直接返回pivot即可。
- 当m<k时,所寻找的元素一定在L【m+1…n】中,因此可以对L【m+1…n】进行递归的查找第k-m小的元素。
- 当m>k时,所寻找的元素一定在L【1…m-1】中,因此可以对L【1…m-1】进行递归的查找第k-m小的元素。
代码如下:
int k_min(int a[],int low,int high, int k){
int pivot=a[low];
int low_temp=low;
int high_temp=high;
while(low<high){
while(low<high && a[high]>=pivot)
--high;
a[low]=a[high];
while(low<high && a[low]<=pivot)
++low;
a[high]=a[low];
}
//上面就是快排的划分算法
//下面是这次算法的内容
a[low]=pivot;
if(low==k) return a[low];
if(low>k) return k_min(a,low_temp,low-1,k);
else return k_min(a,low+1,high_temp,k);
}