找出最小的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), ...
随机推荐
- (转)苹果消息推送服务器 php 证书生成
1.准备好 aps_developer_identity.cer , push.p12这两个证书文件 2. 生成证书如下: openssl x509 -in aps_developer_identit ...
- Java 将自己定义的对象作为HashMap的key
须要继承Map的equals函数和hashCode函数 package com.category; import java.util.HashMap; public class GenCategory ...
- [ES6] Rest Parameter
Problem with the ES5: function displayTags(){ for (let i in arguments) { let tag = arguments[i]; _ad ...
- Nested Class Templates
Templates can be defined within classes or class templates, in which case they are referred to as ...
- 台式电脑部署xen虚拟化的各种问题
本打算用一台台式机做xen虚拟化,搞了一天搞得焦头烂额还是没搞定,中间遇到各种奇葩问题,这里mark一下 1.计划用三块2TB的SATA硬盘,然后装centos5 做虚拟化,结果忘记了centos5最 ...
- (五)《Java编程思想》——final关键字
可能使用final的三种情况:数据.方法.类. 1.final数据 final 常量必须是基本类型数据,且在定义时须赋值: 一个既是static又是final的域只占据一段不能改变的存储空间,只有一份 ...
- a标签的onclick和href事件的区别
在执行顺序上href是低于onclick的,那么这个会造成什么影响呢 <div onclick="a()"> <a href="#" oncl ...
- Java ----------- 正则表达式(更新中。。。。。。)
RegEx:Regular Expression. 元字符 描述 \ 将下一个字符标记符.或一个向后引用.或一个八进制转义符.例如,“\\n”匹配\n.“\n”匹配换行符.序列“\\”匹配“\”而“\ ...
- TableView基本使用
TableView基本使用 基本步奏 1设置数据源 self.tableview.dataSource = self; 2遵守协议 @interface ViewController () <U ...
- 分享一个js生成二维码的库
二维码用js生成会比用服务器生成方便很多,只要把window.location.href的值传入,即可生成对应的二维码..最主要是,这个库可以兼容ie6~ie9哦... 具体使用,请看官网:http: ...