先从数组A[ ]中取前k个元素建立大根堆,然后再遍历剩下的n-k个元素,
如果大于或者等于堆顶,则舍弃;
如果小于堆顶,则将其与堆顶替换,并将换下来的堆顶舍弃,然后重新向下调整为大根堆,最后堆顶即为所求。
时间复杂度为O(nlogk)
/*给定数组A[n],设计最优算法查找第k小元素,最优算法是堆排序,时间复杂度O(nlogk)*/
void Adjust(A[],k,len){
int i;
A[0]=A[k];
for(i=k*2;i<len;i*=2){
if(A[i]<A[i+1]){
i++;
}
if(A[0]<A[i]){
A[k]=A[i];
k=i;
}
else break;
}
A[k]=A[0];
}
void HeapSort(int A[]){
int n=A[].length;
for(i=k/2;i>=1;i--) //取前k个元素建立大根堆
Adjust[A,i,k];
for(i=k+1;i<=n;i++){
if(A[i]<A[1]){ //A[1]位堆顶
A[1]=A[i];
Adjust[A,1,k];
}
}
return A[1]; //堆顶即为所求
}