數據結構實驗之排序四:尋找大富翁 SDUT 3401

Problem Description
2015胡潤全球財富榜調查顯示,個人資產在1000萬以上的高淨值人羣達到200萬人,假設給出N個人的個人資產值,請你快速找出排前M位的大富翁。

Input
首先輸入兩個正整數N( N ≤ 10^6)和M(M ≤ 10),其中N爲總人數,M爲需要找出的大富翁數目,接下來給出N個人的個人資產,以萬元爲單位,個人資產數字爲正整數,數字間以空格分隔。

Output
一行數據,按降序輸出資產排前M位的大富翁的個人資產值,數字間以空格分隔,行末不得有多餘空格。

Sample Input
6 3
12 6 56 23 188 60

Sample Output
188 60 56

Hint
請用堆排序完成。

#include <stdio.h>

int a[15];

void Sort(int low, int high)
{
    if(low>=high) return;
    else
    {
        int key, i;
        key = a[low];
        for(i=low*2; i<=high; i*=2)
        {
            if(i<high&&a[i+1]<a[i]) i++;
            if(a[i] >= key) break;
            else
            {
                a[low] = a[i];
                low = i;
            }
        }
        a[low] = key;
    }
}

int main()
{
    int n, m, i, x, t;
    scanf("%d %d", &n, &m);
    for(i=1;i<=m;i++)
    {
        scanf("%d", &a[i]);
    }
    for(i=m/2;i>=0;i--)
    {
        Sort(i, m);
    }
    n-=m;
    while(n--)
    {
        scanf("%d", &x);
        if(x>a[1])
        {
            a[1] = x;
            for(i=m/2;i>0;i--)
            {
                Sort(i, m);
            }
        }
    }
    for(i=m;i>0;i--)
    {
        t = a[1];
        a[1] = a[i];
        a[i] = t;
        Sort(1, i-1);
    }
    for(i=1;i<=m;i++)
    {
        if(i==m) printf("%d\n", a[i]);
        else printf("%d ", a[i]);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章