100w个数中找出最大的k个数

来源:互联网 发布:h5 css3网站模版源码 编辑:程序博客网 时间:2024/06/11 00:40

题目:100w个数中找出最大的k个数

1.思路1:我们应该首先想到是先将100w个数排序,暂且不考虑效率问题,可是内存中能放得下吗?
2.思路2:堆排序,先从中去k个数进行堆排,然后一个一个数进行比较替换,每替换一次都得将堆下调一次,去保证堆得特性;

函数FindMaxKNum():俩件事;一、取k个数进行建堆;二、进行数据替换,替换完一次下调一次,保证堆的特性;
函数AdjustDown():将堆进行下调;算法:先找到堆得最后一个叶子结点父亲;即((k-1)-1)/2;

代码如下:

<span style="font-size:18px;">#include<iostream>#include<assert.h>using namespace std;//向下调整void AdjustDown(int* arr, int len, int root){int child = root * 2 + 1;while (child < len){if (child + 1 < len && arr[child] > arr[child + 1])++child;if (arr[child] < arr[root]){swap(arr[child], arr[root]);root = child;child = root * 2 + 1;}else{break;}}}void Print(int* arr, int len){assert(arr);assert(len > 0);for (int i = 0; i < len; ++i){cout << arr[i] << " ";}cout << endl;}//100w中找出最大的前k个数void FindMaxKNum(int* arr, int n,int k){assert(arr);assert(n > 0 && k > 0);int* heap = new int[k];int i = 0;//取k个数for (; i < k; ++i){heap[i] = arr[i];}//建堆,找最大的k个数,建小堆i = k;for ((i - 2) / 2; i >= 0; --i){AdjustDown(heap, k, i);}//替换数据,并下调数据,使得堆保持它的特性for (i = k; i < n; ++i){if (heap[0] < arr[i]){heap[0] = arr[i];AdjustDown(heap, k, 0);}}Print(heap, k);delete[] heap;}void TestFindMaxKNum(){int* arr = new int[1000000];int i = 0;for (; i < 1000000; ++i){arr[i] = i;}arr[0] = 999999;arr[1] = 999999;arr[2] = 999999;FindMaxKNum(arr, 1000000, 100);delete[] arr;}</span>
测试结果如下图





1 0