找出最小的k个数
//利用最大根堆实现最小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个数的更多相关文章
- 编程题目: 找出最小的k个数
找出最小或者最大的几个数我使用的是堆排序,效率为0(nlgn) 构建小顶堆返回末尾的k个数 或者 构建大顶堆返回前k个数 #!/usr/bin/env python3 def heap_sort(ar ...
- 数组中找出最小的K个数
题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 public static void printKNum ...
- 华为OJ平台——输出最小的k个数
输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...
- 剑指Offer 29. 最小的K个数 (其他)
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 题目地址 https://www.nowcoder.com/prac ...
- 剑指:最小的k个数
题目描述 输入 n 个整数,找出其中最小的 K 个数.例如输入 4,5,1,6,2,7,3,8 这 8 个数字,则最小的 4 个数字是 1,2,3,4. 解法 解法一 利用快排中的 partition ...
- Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法
最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么 ...
- 剑指Offer面试题:27.最小的k个数
一.题目:最小的k个数 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 这道题是典型的TopK问题,其最简单的思路莫过于 ...
- 剑指offer面试题30:最小的k个数
一.题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.解题思路 1.思路1 首先对数组进行排序,然后取出前k个数 ...
- 算法试题 - 找出最小 k 个数
题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...
随机推荐
- 数据库版本管理工具Flyway(4.0.3)---介绍(译文)
Flyway Evolve your Database Schema easily and reliably across all your instances 简单的.可靠的升级(发展)你的数据库模 ...
- 使用zTree控件制作的表格形式的树形+数据菜单
測试了一下,兼容ie7以上, chrome opera ff 不使用对方css /*------------------------------------- zTree Style version: ...
- C#。2.1 运算符
运算符: 一.算术运算符: + - * / % ——取余运算 取余运算的应用场景: 1.奇偶数的区分. 2.把数变化到某个范围之内.——彩票生成. 3.判断能否整除.——闰年.平年. int a = ...
- 从客户端检测到有潜在危险的Request.Form值
1.带有html标记内容提交(使用web编辑器): js: <script type="text/javascript"> //简单模式 var editor; Kin ...
- 东软实训3-servlet基础
Java Servlet技术的核心就是在服务端创建能响应用户请求的对象,被创建的对象习惯上称为一个Servlet对象. 编写一个创建servlet对象的类就是编写一个特殊类的子类,这个特殊的类就是ja ...
- TCP/IP 要点备忘
1. 3次握手/4次挥手过程,以及状态变化: 2. RTT,TTL,TOS(8位服务类型,最小延时.最大吞吐.最高可用.最小费用). 3. TimeWait(2msl)状态,防止最后一个ack丢失 4 ...
- 安卓java设置字体颜色
textView03.setTextColor(this.getResources().getColor(R.color.botomfontColorUnSel));
- 关于在transform下的子元素设置fixed无效的困惑
最近的项目是要实现一个点击显示隐藏边栏的效果,而且需要边栏随着滚动而滚动. 思路简单,不就一个css的动画和一个position为fixed,搞定!但不想,设为fixed的子元素竟然无法fixed,这 ...
- HTML&CSS基础学习笔记1-简单网页中有哪些标签?
一个简单网页中有哪些HTML标签? 平时我们看到的网页,都是由HTML的标签来组成的.HTML标签非常多,我们先来认识一部分. 1. <html></html>称为根标签,所有 ...
- Python学习笔记总结(一)对象和流程语句总结
一.对象类型 1.数字 数字:不可变 2.字符串 字符串:不可原处修改[修改需要创建新的对象],有顺序,支持求长(len),合并(+),重复(*),索引S[0],分片(S[1:3]],成员测试(in) ...