先从数组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];	//堆顶即为所求 
}