推排序

来源:互联网 发布:智慧树网络课怎么刷课 编辑:程序博客网 时间:2024/04/29 05:48

题目描述:

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

输入:

每个测试案例包括2行:

第一行为2个整数n,k(1<=n,k<=200000),表示数组的长度。

第二行包含n个整数,表示这n个数,数组中的数的范围是[0,1000 000 000]。

输出:

对应每个测试案例,输出最小的k个数,并按从小到大顺序打印。

样例输入:
8 4
4 5 1 6 2 7 3 8
样例输出:
1 2 3 4



#include <stdio.h> int adjust_heap(int *array, int head, int len){    int nchild;    int i;         for(; 2 * head + 1 < len; head = nchild)    {        nchild = 2 * head + 1;        if(nchild < len - 1 && array[nchild] > array[nchild + 1])        {            nchild++;        }        if(array[head] > array[nchild])        {            int t;            t = array[head];            array[head] = array[nchild];            array[nchild] = t;        }        else        {            break;        }    }    return 0;} int heap_sort(int *array, int len, int k){    int i;         for(i = len / 2 - 1; i >= 0; i--)    {        adjust_heap(array, i, len);    }         for(i = len - 1; i >= len - k; i--)    {        int t;        t = array[0];        array[0] = array[i];        array[i] = t;        adjust_heap(array, 0, i);    }} int main(){    int n, k;         while(scanf("%d%d", &n, &k) != EOF)    {        int *array;        int i;                 array = (int *)calloc(n, sizeof(int));        for(i = 0; i < n; i++)        {            scanf("%d", &array[i]);        }        heap_sort(array, n, k);                 for(i = n - 1; i >= n - k + 1; i--)        {            printf("%d ", array[i]);        }        printf("%d\n", array[n - k]);         free(array);    }         return 0;} /**************************************************************    Problem: 1371    User: dellzhui    Language: C    Result: Accepted    Time:830 ms    Memory:1696 kb****************************************************************/


0 0
原创粉丝点击