#include <stdlib.h>
#include <stdio.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void find_k(int a[], int left, int right, int k)//对a排序,排除最小的i-s个数,如果这几个数>k,则对这几个数继续排序,继续排除最小的i-s个数,一个个的减下去直到最后一个最大的数
{
if ( k <= 0)
return;
int s = left, i, j;
if(right - left+1 <= k)
{ /*ok*/
for(j = left ; j <= right ;j++)
printf("%d ",a[j]);
return;
}
for( i = left ; i < right ;i++ )
{
if(a[i] > a[right]) //a[right]充当最小的数每次把最小的数赋给他
{
swap(&a[s++], &a[i]);
}
}
swap(&a[s], &a[right]);
if(s - left >= k)
{
find_k(a, left, s - 1, k);
}
else
{
find_k(a, left, s-1, s-left);//对左边的s-left个数进行排序,但是可以肯定的是左边的数比右边的数大
find_k(a,s, right, k -(s-left));//对右边的数进行排序选出最大的k-(s-left)个数
}
}
int main ( )
{
int a[100], n, k, i;
scanf("%d %d", &n, &k);
for( i = 0 ;i < n ;i++)
{
scanf("%d", &a[i]);
}
find_k(a, 0 ,n-1, k);
printf("\n");
return 0;
}
求n个数中最大的k个数
最新推荐文章于 2020-02-01 14:19:31 发布