算法分析与设计
分治法之第k小问题
问题描述:
对n个不同的数构成的数组A[1…n],求出第k小的元素。
算法思路:
利用快排的思想,每次取出一个mid,然后以mid为基准将数分为左右两个部分,根据两个部分数的个数确定第k小的元素在哪个部分,继续进行递归查找。
核心代码:
void select_k(int arr[],int l,int r,int k){
int i=l,j=r,mid=arr[(l+r)>>1];
while(i<=j){
while(arr[i]<mid) i++;
while(arr[j]>mid) j--;
if(i<=j){
swap(arr[i],arr[j]);
i++,j--;
}
}
if(l<=j&&k<=j-l+1) select_k(arr,l,j,k);
if(i<=r&&k>=i-l+1) select_k(arr,i,r,k-(i-l));
}
时间复杂度:
算法的时间复杂度近似为O(n)。
源码:
https://github.com/SpiritDemon-max/myText/blob/master/select_k.cpp