查找最小的k个元素(数组)
2014-07-27 23:43
232 查看
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
1 在数据量不大的情况下,排序
2 维护一个最小k 的数组 ,复杂度 为 o(k * N)
3 为一个最小K个数的最大堆 o(log2 k * N)
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
1 在数据量不大的情况下,排序
2 维护一个最小k 的数组 ,复杂度 为 o(k * N)
3 为一个最小K个数的最大堆 o(log2 k * N)
/* 查找最小的k 个元素 题目:输入n 个整数,输出其中最小的k 个。 例如输入1,2,3,4,5,6,7和8这8个数字, 则最小的4个数字为1,2,3和4。 */ /* 思路 : 来一个数据处理一个 ,当来的数据量小于K 时 ,全部处理成最大堆, 然后之后来的,必须要小于最大堆的的最大值,才可以入堆,此时 只需更新 根节点,再调整堆。 */ # include<stdio.h> # include<stdlib.h> const int K = 5 ;//这里可以修改 const int MAXN = 1000; int max_heap[K+1] ;//维护一个 最大堆 int end ,maxPos; void swap(int &a ,int &b) { int t = a;a = b ; b = t; } int FindMax() { int maxPos = 1; for(int i = 2 ;i <= K ; i ++) if(max_heap[i] >max_heap[maxPos] ) maxPos = i; return maxPos; } /*将数据插入到 数组中 插入排序的思想*/ void insertMinHeap(int mdata) { int i,child = 0; if(end == K +1 ) // 如果堆满 { /* int mmaxPos = FindMax();*/ if(mdata >= max_heap[1] ) // 如果大于等于该堆的最大值 不做任何改变 return ; max_heap[1] = mdata; for(i = 1 ; i*2 <= K ;i = child) { child = 2*i ; if((i*2 +1 <= K && max_heap[i*2] < max_heap[i*2+1]) )//返回最大孩子的下表 child ++; if(max_heap[i] < max_heap[child]) swap(max_heap[i] ,max_heap[child]); else { break; } } return ; } max_heap[end ++] = mdata; for(i = end -1 ; i > 1 ; i /=2) { if(max_heap[i] > max_heap[i/2]) swap(max_heap[i] ,max_heap[i/2]); else { break; } } } int main() { int n,data; freopen("in.txt","r",stdin);//如果想从文件输入 将这句注释掉 1234 1 2 3 4 5 6 7 8 9 10 11 end = 1; while(scanf("%d",&data)!=EOF) // 如果是手工输入 结束输入 按 ctrl + z { insertMinHeap(data); } for(int i = 1 ; i <= K ; i ++) // printf("%d ",max_heap[i]); printf("\n"); return 0; }
相关文章推荐
- 关于查找数组中最小的k个元素的解答、updated
- 5.查找最小的k个元素(数组)
- 算法实验一:二分查找算法改进: 当搜索元素x不存在时,返回小于x的最大元素位置i和大于x的最小元素位置j. 当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 无序数组同时查找最大和最小的元素
- 查找最小的k个元素(数组)
- 5.查找最小的k个元素(数组)
- 5. 微软面试题: 查找最小的k个元素(数组)
- 实验9 指针1 、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依
- 设计一个最优算法来查找n个元素数组中的最大值和最小值
- 给定数组,查找最小的k个元素或最大的k个元素 快速排序算法灵活应用
- 5.查找最小的k个元素(数组)
- 面试题15 - 查找最小的 k 个元素 [数组] / (堆优化 STL O(nlogk) )[STL]
- 查找旋转数组中的最小值元素(剑指offer8)
- 关于查找数组中最小的k个元素的解答、updated
- 每天一算法(查找最小的k个元素(数组))
- No5、查找最小的 k 个元素(数组)
- 在一个数组中查找最大的K个元素或者最小的K个元素
- 查找数组中第二个最小元素
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】