数据结构实验之排序四:寻找大富翁
Time Limit: 200 ms Memory Limit: 512 KiB
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
请用堆排序完成。
Source
xam
think:先找出最小的堆, 然后直接快排
纯c代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int q[11];
void qs(int l, int r)
{
int i = l, j = r;
int x = q[i];
if(i >= j) return ;
while(i < j)
{
while(i < j && q[j] <= x) j--;
q[i] = q[j];
while(i < j && q[i] >= x) i++;
q[j] = q[i];
}
q[i] = x;
qs(l, i - 1);
qs(i + 1, r);
}
int main()
{
int n, m, i, k, t, j;
scanf("%d%d", &n, &m);
int l = 0;
while(n--)
{
scanf("%d", &t);
if(l < m)
q[l++] = t;
else
{
j = 0;
for(k = 1; k < m; k++)
{
if(q[j] > q[k])
j = k;
}
if(q[j] < t)
q[j] = t;
}
}
qs(0, l - 1);
for(i = 0; i < l; i++)
{
if(i == l - 1)
printf("%d\n", q[i]);
else
printf("%d ", q[i]);
}
return 0;
}