•已知数组中的n个正数,找出其中最小的k个数。
•例如(4、5、1、6、2、7、3、8),k=4,则最小的4个数是1,2,3,4
•要求:
–高效;
–分析时空效率
•扩展:能否设计出适合在海量数据中实现上述运算?
 
 
 
方法一:
 //利用最大根堆实现最小k个节点
//最大根堆特点:每个节点都比他左右孩子要大
//调整最大堆的时间复杂度为O(lnK),因此该算法(问题)时间复杂度为O(nlnK).
//思路:通过数组建堆
//规律:第i个节点的左孩子为2i+1,右孩子为2i+2 #include <iostream> using namespace std;
int n;
int K;
int* stack;
void InitStack();
void ReStack(int parent);
int baseJudge(int parent);
int maxnode(int parent, int lc);
int maxnode(int parent, int lc, int rc); //将最大数换给父节点(右子不存在) 返回替换前的最大值位置 未替换返回0
int maxnode(int parent, int lc) {
if (stack[parent] < stack[lc]) {
int tmp = stack[parent];
stack[parent] = stack[lc];
stack[lc] = tmp;
return lc;
}
return ;
} //将最大数换给父节点(左右子都存在) 返回替换前的最大值位置 未替换返回0
int maxnode(int parent, int lc, int rc) {
if (stack[parent] < stack[lc]) {
int tmp = stack[parent];
if (stack[lc] < stack[rc]) {
stack[parent] = stack[rc];
stack[rc] = tmp;
return rc;
}
else {
stack[parent] = stack[lc];
stack[lc] = tmp;
return lc;
}
}
return ;
} //初始化堆
void InitStack() {
int lastpn = (K / == ) ? (K - ) / : (K - ) / ; //确定最后一个非叶子节点
for (int parent = lastpn; parent > ; parent--) {
baseJudge(parent);
}
} //判断函数
int baseJudge(int parent) {
int lc = * parent + ;
int rc = * parent + ;
if (lc > K) return ;
int tmp;
if (rc <= K) { //说明右子存在
return maxnode(parent, lc, rc);
}
else {
return maxnode(parent, lc);
}
} //递归判断
void ReStack(int parent) {
int p = baseJudge(parent);
if (p) ReStack(p); //如果产生了交换,则从被交换的节点开始继续重建堆
} int main(void) {
cout << "输入K值:";
cin >> K;
stack = new int[K];
cout << "数据个数:";
cin >> n;
cout << "依次输入:";
for (int i = ; i < K; i++)
cin >> stack[i];
InitStack();
int tmp;
for (int i = K; i < n; i++) {
cin >> tmp;
if (tmp < stack[]) {
stack[] = tmp;
ReStack();
}
}
cout << "最小k个数:";
for (int i = ; i < K; i++) cout << stack[i] << " ";
cout << endl;
return ;
} /*
样例输入:
4
20
7 5 1 10 3
6 11 4 7 9
25 13 47 6 20
13 47 68 32 1 样例输出:
4 3 1 1
*/

找出最小的k个数的更多相关文章

  1. 编程题目: 找出最小的k个数

    找出最小或者最大的几个数我使用的是堆排序,效率为0(nlgn) 构建小顶堆返回末尾的k个数 或者 构建大顶堆返回前k个数 #!/usr/bin/env python3 def heap_sort(ar ...

  2. 数组中找出最小的K个数

    题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 public static void printKNum ...

  3. 华为OJ平台——输出最小的k个数

    输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...

  4. 剑指Offer 29. 最小的K个数 (其他)

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 题目地址 https://www.nowcoder.com/prac ...

  5. 剑指:最小的k个数

    题目描述 输入 n 个整数,找出其中最小的 K 个数.例如输入 4,5,1,6,2,7,3,8 这 8 个数字,则最小的 4 个数字是 1,2,3,4. 解法 解法一 利用快排中的 partition ...

  6. Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法

    最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么 ...

  7. 剑指Offer面试题:27.最小的k个数

    一.题目:最小的k个数 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 这道题是典型的TopK问题,其最简单的思路莫过于 ...

  8. 剑指offer面试题30:最小的k个数

    一.题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.解题思路 1.思路1 首先对数组进行排序,然后取出前k个数 ...

  9. 算法试题 - 找出最小 k 个数

    题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...

随机推荐

  1. if(!!attr)是什么鬼???

    看到很多代码if(!!attr),为什么不直接写if(attr):其实这是一种更严谨的写法:请测试 typeof 5和typeof !!5的区别.!!的作用是把一个其他类型的变量转成的bool类型.

  2. 新浪微博登陆,获取token

    用WeiboAuthListener获取code 用下面的代码获取token..半成品的sdk真让人捉急. String code = values.getString("code" ...

  3. [React Testing] className with Shallow Rendering

    The React Shallow Renderer test utility lets us inspect the output of a component one level deep. In ...

  4. js获取每个按键的ASCII值

    通过js绑定键盘按下事件onkeydown获取每个按键的ascII值. js获取每个按键的ascii值 <script language="javascript"> / ...

  5. easyui 快速开发整理

    下面整理了关于easyui的datagrid的开发文档,复制黏贴即刻使用 1: <link href="../../Content/easyUI/themes/default/easy ...

  6. Android WiFiDirect 学习(二)——Service Discovery

    Service Discovery 简介 在Android WifiDirect学习(一 )中,简单介绍了如何使用WifiDirect进行搜索——连接——传输. 这样会有一个问题,那就是你会搜索到到附 ...

  7. Visual Studio 2015开发Android App问题集锦

    Visual Studio 2015开发Android App 启动调试始终无法完成应用部署的解决方案 创建一个Android App项目后,直接启动调试发现Visual Studio Emulato ...

  8. Hadoop map reduce 任务数量优化

    mapred.tasktracker.map.tasks.maximum 官方解释:The maximum number of map tasks that will be run  simultan ...

  9. unity中数据的持久化存储

    unity 提供了PlayerPrefs这个类用于存储游戏数据到电脑硬盘中. 这个类有10个函数可以使用 Class Functions类函数 SetInt Sets the value of the ...

  10. POJ3484 Showstopper (二分+字符串处理)

    POJ3484 Showstopper 题目大意: 每次给出三个数x,y,z,用这三个数构成一个等差数列,x为首项,y是末项,z是公差 总共给出n组x,y,z( n待定),求这n组数列中出现次数为奇数 ...