找出N个数据中的最大的K个数据——堆排序

  

,,从N个数据中找出最大的K个数据,而且这里有一个限制:内存里存不下所有的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,算是效率比较高的算法了,值得我们去掌握的。

找出N个数据中的最大的K个数据——堆排序