資料結構實驗之排序四 尋找大富翁 堆排序

2021-08-04 05:02:26 字數 1252 閱讀 4589

time limit: 200ms

memory limit: 512kb

problem description

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

input

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

output

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

example input

6 3

12 6 56 23 188 60

example output

188 60 56

hint

請用堆排序完成。 

author

xam 白話經典演算法系列之七 堆與堆排序 +啊哈演算法

blablabla: 節約時間之竟然還有這種操作系列。。。

因保留多的大富翁資產,所以只存多的幾個就行。存完再堆排序。

排出最大堆之後,交換h[1]和h[n],堆的大小減一,並將h[1]向下調整以保持堆的特性。

最後得到按照從小到大排序的序列。(同理也可排出最小堆後,交換得到從大到小的序列)

1.堆排序 (from aha algorithms)

#include using namespace std;

int h[1011200];

void swap(int x, int y)//交換

void siftdown(int i, int n)//向下調整

else t= i; if(i*2+1 <= n && h[t] < h[i*2+1]) if(t != i) else flag = 1;//否則說明當前父結點已比兩個兒子大了,不需要繼續調整了 } return ;}void creat(int n) return ;}void heapsort(int n)//堆排序 return ;}int main() if(h[l] < t) h[l] = t; } } int num = n; creat(m); heapsort(m); for(i=m; i>1; i--) printf("%d",h[i]); } return 0;}

2.快排

sort解決。。。

資料結構實驗之排序四 尋找大富翁

time limit 150ms memory limit 512k 有疑問?點這裡 2015胡潤全球財富榜調查顯示,個人資產在1000萬以上的高淨值人群達到200萬人,假設給出n個人的個人資產值,請你快速找出排前m位的大富翁。首先輸入兩個正整數n n 10 6 和m m 10 其中n為總人數,m為...

資料結構實驗之排序四 尋找大富翁

由於這道題既要求時間,又要求記憶體,所以我們可以建造乙個只含m個元素的小頂堆,剩下的n m個元素與小頂堆的第乙個元素比較,若大於小頂堆的根元素,就將其替換掉,然後將其重新調成小頂堆,重複上述過程,直至將n m個元素比較完,此時原來的小頂堆就變成乙個大頂堆。如下 include int a 15 vo...

資料結構實驗之排序四 尋找大富翁

time limit 150ms memory limit 512k 2015胡潤全球財富榜調查顯示,個人資產在1000萬以上的高淨值人群達到200萬人,假設給出n個人的個人資產值,請你快速找出排前m位的大富翁。首先輸入兩個正整數n n 10 6 和m m 10 其中n為總人數,m為需要找出的大富翁...