•已知数组中的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. java,大数据批量插入、更新

    public void exec(Connection conn){ try { conn.setAutoCommit(false); Long beginTime = System.currentT ...

  2. PHP中字符串类型与数值类型混合计算

    字符串转数值的规则 当一个字符串被当作一个数值来取值,其结果和类型如下: 如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串 ...

  3. Linux下使用虚拟网卡的ingress流控(入口流控)

    Linux内核实现了数据包的队列机制,配合多种不同的排队策略,可以实现完美的流量控制和流量整形(以下统称流控).流控可以在两个地方实现,分别为egress和ingress,egress是在数据包发出前 ...

  4. JAVA 将接口的引用指向实现类的对象

    有一个很简单的例子,java.util中的类ArrayList实现了接口List则生成ArrayList对象时可用以下语句. List list=new ArrayList(); 也就是说所有实现了接 ...

  5. c++应用程序文件的编译过程

    这里讲下C++文件的编译过程及其中模板的编译过程: 一:一般的C++应用程序的编译过程.     一般说来,C++应用程序的编译过程分为三个阶段.模板也是一样的. 在cpp文件中展开include文件 ...

  6. 【Android】Activity的菜单机制和方法解析

    Activity有一套机制来实现对菜单的管理,方法如下: 1. 初始化菜单 public boolean onCreateOptionsMenu(Menu menu) 此方法用于初始化菜单,其中men ...

  7. Mysql数据库的mysql Schema 究竟有哪些东西&amp; 手工注入的基础要领

    #查看数据库版本号 mysql> select @@version; +------------+ | @@version  | +------------+ | 5.5.16-log | +- ...

  8. 从html字符串中获取div内容---jquery

    思考的问题: 怎么在一个网页的div中嵌套另外的网页(不使用inclue,iframe和frame,不使用他们的原因,include只能嵌套静态网页,iframe对网络爬虫影响,frame嵌套网页无法 ...

  9. 关于html控件和服务器控件摁回车后提交按钮的问题

    今天做项目用到,项目是一个洗车系统,刷卡后在焦点出自动触发回车键事件,如,一个文本框,把焦点放入,刷一下卡,文本框自动获取卡号,同时触发回车事件,(就像银行办卡一样),发现刷卡后页面刷新后并没有执行按 ...

  10. MiniUI学习笔记1

    1.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...