题目:输入n个整数,找出其中最小的k个数。
思路:利用快排思想,使得比k个数字小的所有数字都位于数组的左边,比k个数字大的所有数字都位于数组的右边。
#include <stdio.h>
#define K 4
int partition(int a[], int left, int right)
{
int i=left,j=right;
int temp = a[i];
while(i<j)
{
while(i<j && a[j]>=temp)
j--;
if(i<j)
a[i++] = a[j];
while(i<j && a[i]<temp)
i++;
if(i<j)
a[j--] = a[i];
}
a[i] = temp;
return i;
}
void get_number(int a[], int len, int b[], int k)
{
if(a==NULL || b==NULL || k>len || len<=0 || k<=0)
return;
int start = 0;
int end = len - 1;
int index = partition(a,start,end);
while(index != k-1)
{
if(index > k-1)
{
end = index-1;
index = partition(a,start,end);
}
else
{
start = index + 1;
index = partition(a,start,end);
}
}
int i;
for(i=0;i<=index;i++)
b[i] = a[i];
}
int main()
{
int a[] = {4,5,1,6,2,7,3,8};
int len = sizeof(a)/sizeof(int);
int b[K];
int i;
printf("原数组为:\n");
for(i=0;i<len;i++)
printf("%d\t",a[i]);
printf("\n");
get_number(a,len,b,K);
printf("最小的k个数:\n");
for(i=0;i<K;i++)
printf("%d\t",b[i]);
printf("\n");
return 0;
}