•已知数组中的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. Linux安装mysql-python库时报错解决办法

    用pip安装mysql-python库的时候遇到如下报错 root@LoidAir:~# pip install mysql-python Collecting mysql-python Using ...

  2. 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。

    1.服务器 #include<winsock2.h> //包含头文件#include<stdio.h>#include<windows.h>#pragma comm ...

  3. 通过数组初始化链表的两种方法:指向指针的引用node *&tail和指向指针的指针(二维指针)node **tail

    面试高频题:单链表的逆置操作/链表逆序相关文章 点击打开 void init_node(node *tail,char *init_array) 这样声明函数是不正确的,函数的原意是通过数组初始化链表 ...

  4. GitHub 小试

    GitHub是什么? 它是用来进行版本控制的,就是用来保存项目的地方. 但是项目要是运行,还是需要你本地的环境,它只不过是用来保存代码罢了. GitHub如何操作? 可以通过客户端进行代码提交,更新. ...

  5. linux服务器内存占用太高-释放内存

    修改/proc/sys/vm/drop_caches,释放Slab占用的cache内存空间(参考drop_caches的官方文档): Writing to this will cause the ke ...

  6. linux文件解-压缩

    常用: 解压tar.gz包  使用命令:tar -zxvf  file.tar.gz   -z 指有gzip的属性  -x 解开一个压缩文件的参数  -v解压过程中显示文件  -f放最后接filena ...

  7. 根据id查询数据(向前台返回json格式的数据)

    /** *@description 根据主键查询Bean */ @RequestMapping(value="/getBean/{getId}") public void getB ...

  8. plsql编程中游标的使用

    游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作. oracle中显示使用游标一般要包含以下5个步骤: 声明一些变量以便存储从游 ...

  9. 折叠UITableView分组实现方法

    做项目的时侯用到了折叠分组,最近就研究了一下,找了一些网上的项目,发现有一些缺点,研究了几天自己终于写出了一个.而且分组的数据源比较灵活,每组之间的状态没有什么影响. 实现的大体思路是每个分组用一个s ...

  10. C#中对Excel进行操作

    工作中要处理一批数据,主要是处理从别处导出来的Excel表格(大概有一千多行,三十多列),拿到表格对Excel表格进行分析,按照一定的规则进行拆分成为一万多行的数据:首先这个需求要用程序进行处理的背景 ...