寻找最小的k个数
题目描述
输入n个整数,输出其中最小的k个。
解法1:排序,输出最小k个
解法2:堆排序,构造小顶堆,排序过程中,输出前k个最小值后停止(不够一次完整的堆排序) O(n*logk)
解码3:线性时间查找,类似于快速排序中的划分方法
//输出最小的k个数
int partition(int input[],int start,int end){
if(start==end)
return start;
int guard = input[start];
while(start<end){
while(start<end&&input[end]>guard)
end--;
input[start] = input[end];
while(start<end&&input[start]<guard)
start++;
input[end] = input[start];
}
input[start] = guard;
return start;
}
void quickSelect(int input[],int start,int end,int k){
if(start>end)
return;
int location = partition(input,start,end);
if(location == (k-1)){
print(input,location);
return;
}else if(location > (k-1))
quickSelect(input,start,location-1,k);
else
quickSelect(input,location+1,end,k);
}