题目(剑指offer面试题30):
输入n个整数,找出其中最小的k个数。例如输4、5、1、6、2、7、3、8这8个数,则最小的4个数为1、2、3、4。
分析:
可以利用快速排序算法Partition来解决,如果是基于第k个数来调整数组,那么调整后的数组的左边的数字都小于第k个数,右边都的数字都大于第k个数,这样的结果是左边的k个数字就是要找的最小的k个数字。
代码:
void GetLeastNumbers(int * input,int n,int* output,int k)
{
if(input == NULL || output == NULL || k > n || n <= 0 || k <= 0)
return ;
int start = 0;
int end = n -1 ;
int index = Partition(input,n,start,end);
while(index != k-1)
{
if(index > k-1)
{
end = index -1 ;
index = Partition(input,n,start,end);
} else {
start = index + 1;
index = Partition(input,n,start,end);
}
}
for(int i=0; i< k ; i++)
output[i] = input[i];
}
采用这种算法的限制就是输入的数组被改变了。