《编程之法》:寻找最小的k个数
来源:互联网 发布:南通cnc数控编程培训 编辑:程序博客网 时间:2024/05/16 15:18
题目
标题
有n个整数,请找出其中最小的k个数。
思路
维护一个容量为k的最大堆,用来存储最先遍历的k个数。建好堆后遍历剩余n-k个整数,将每次遍历到的新元素与堆顶做比较,若比堆顶小,则用该元素替换堆顶,然后更新堆。遍历结束后堆中的k个数即是最小的k个数。
代码
//// Created by huxijie on 17-3-18.// 寻找最小的k个数#include <iostream>#include <random>using namespace std;bool myless(int result[],int i,int j) { if (result[i]<result[j]) return true; else return false;}void exch(int result[],int i, int j) { int tmp = result[i]; result[i] = result[j]; result[j] = tmp;}//由上至下的堆有序化,下沉void sink(int result[],int m,int n) { while (2 * m + 1 <= n - 2) { int j = 2 * m + 1; if (j + 1 <= n-1 && myless(result, j, j + 1)) { j = j + 1; } if (!myless(result, m, j)) { break; } else { exch(result, m, j); m = j; } }}int *FindMinK(int numbers[],int n,int k) { int *result = new int[k]; for (int i = 0; i < k; ++i) { result[i] = numbers[i]; } //堆排序 for (int j = (k - 1) / 2; j >=0 ; --j) { sink(result, j, k); } //遍历剩下的n-k个数,每次取出堆顶进行比较,若有更改最大值,则调整堆 for (int i = k; i< n; ++i) { if (result[0] > numbers[i]) { result[0] = numbers[i]; sink(result, 0, k); } } return result;}int main() { default_random_engine e; e.seed(time(0)); uniform_int_distribution<int> u(-10, 100); int n = 10; int numbers[n]; cout<<"original numbers: "; for (int i = 0; i < n; ++i) { numbers[i] = u(e); cout<<numbers[i]<<" "; } cout<<endl; int k = 5; int *result = FindMinK(numbers, n, k); cout<<"minimal "<<k<<" numbers: "; for (int i = 0; i < k; ++i) { cout << result[i] << " "; } cout<<endl; delete []result; return 0;}
运行结果
original numbers: -3 74 61 72 38 88 12 31 36 64 minimal 5 numbers: 38 36 31 -3 12 Process finished with exit code 0
0 0
- 《编程之法》2.1寻找最小的k个数
- 《编程之法》:寻找最小的k个数
- 寻找最小的k个数
- 寻找最小的k个数
- 寻找最小的K个数
- 寻找最小的k个数
- 寻找最小的K个数
- 寻找最小的k个数
- 寻找最小的k个数
- 寻找最小的k个数
- 寻找最小的k个数
- 寻找最小的k个数
- 寻找最小的k个数
- 寻找最小的k个数
- 寻找最小的 k 个数
- 寻找最小的k个数
- 寻找最小的k个数
- 寻找最小的k个数
- curl抓取gb2312网页时显示乱码
- C++游戏服务器的性能优化
- java多线程之生产者消费者经典问题
- Virtual Box上的Ubuntu与Win7共享文件夹
- 【Python】压缩文件 zipfile
- 《编程之法》:寻找最小的k个数
- pycharm django templates css js html static文件详解
- SQL语句多表联合查询
- Git使用教程
- javascript中window.open()与window.location.href的区别
- CCF 201503-2
- C++抽象编程——字符串(2)——<string>库的应用与字符串遍历
- 认识数据类型和常量变量
- Diffie-Hellman密钥交换算法及其优化