100w个数中找出最大的k个数
题目: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>测试结果如下图:
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 指针用作传出参数时,需要二级指针
- 下一篇: JS~jwPlayer为js预留的回调方法大总结