,,从N个数据中找出最大的K个数据,而且这里有一个限制:内存里存不下所有的N个数据,但是可以存下K个数据。这就让我们打消了用排序的方法来解的念头。
,,在这里我们使用堆排序来完成。
,,
,http://helloleex.blog.51cto.com/10728491/1768758)
,对于最大的K个数据,我们要怎么找出来呢。<强> 强>
- <李>
<强> 强>
李> <李>强>
李> <李># include“windows.h” # include“time.h” # include“head.h”//堆排序 void AdjustDown (int *,,, size_t 大小,size_t 父母)//下调函数 { size_t child =, parent *, 2, +, 1; while (child & lt;,大小) { if (child +, 1, & lt;, size&和一个(孩子),& lt;,一个[child +, 1]) + +孩子; if ((父),& lt;,(孩子)) { 交换((父),(孩子)); 时间=parent 儿童; *=child parent 2, +, 1; } 其他的 打破; } } void 堆排序(int *,,, size_t 大小) {//建堆 for (int 小姐:=,(size 安康;2),/,2,,小姐:祝辞=,0;,,我)//我不能定义为size_t除法会溢出,翻转成一个很大的数 { AdjustDown(大小,,,,我); } for (size_t 小姐:=,0;,小姐:& lt;,大小;,+ + i) { 交换(一个[0],[size 作用;1,安康;我]); AdjustDown (a,, size 安康;小姐:安康;1,0); } } int  void FindMaxK (int N, K)//找出N个数据中最大的K个数据 { int *, arryN =, new int [N]; int *, maxK =, new int [K]; for (int 小姐:=,0;,小姐:& lt;, N,, + + i) { arryN[我],=,(rand (), %, 100); } for (int 小姐:=,0;,小姐:& lt;, N,, + + i) { cout & lt; & lt;, arryN[我],& lt; & lt;,“,”; } cout & lt; & lt;, endl; for (int 小姐:=,0;,小姐:& lt;, K;,我+ +) { maxK[我],=,arryN[我]; } for (int 小姐:=,K;,小姐:& lt;, N,, + + i) { 堆排序(maxK, K); maxK [0],=, arryN[我]; } for (int 小姐:=,0;,小姐:& lt;, K,, + + i) { cout & lt; & lt;, maxK[我],& lt; & lt;,“,”; } 李}>
,堆排序的时间效率是nlogn,算是效率比较高的算法了,值得我们去掌握的。