100题_05 查找最小的k个元素
2011-03-04 06:13
344 查看
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
不多说了,这个题是一个老题了,最简单的办法就是用大顶堆了,每次遍历数组与堆顶元素进行比较,如果比堆顶小,就替换堆顶,继续调整为大顶堆。
代码如下:
View Code #include "MaxHeap.h"
#include <iostream>
using namespace std;
int *min(int a[], int n, int k) // 找出数组中前k个最小的
{
MaxHeap<int> mh(k);
int i;
for (i = 0; i < k; i++)
mh.Insert(a[i]);
for (; i < n; i++)
{
int max = mh.PeekMax();
if (a[i] < max)
mh.ReplaceMax(max);
}
int *result = new int[k];
for (i = k -1; i >= 0; i--)
{
result[i] = mh.RemoveMax();
}
return result;
}
int main()
{
int a[] = {5,3,7,2,6,8,4,9,19,50,18,16};
int *x = min(a, 12, 5);
for (int i = 0; i < 5; i++)
cout<<x[i]<<' ';
cout<<endl;
delete[] x;
return 0;
}
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
不多说了,这个题是一个老题了,最简单的办法就是用大顶堆了,每次遍历数组与堆顶元素进行比较,如果比堆顶小,就替换堆顶,继续调整为大顶堆。
代码如下:
View Code #include "MaxHeap.h"
#include <iostream>
using namespace std;
int *min(int a[], int n, int k) // 找出数组中前k个最小的
{
MaxHeap<int> mh(k);
int i;
for (i = 0; i < k; i++)
mh.Insert(a[i]);
for (; i < n; i++)
{
int max = mh.PeekMax();
if (a[i] < max)
mh.ReplaceMax(max);
}
int *result = new int[k];
for (i = k -1; i >= 0; i--)
{
result[i] = mh.RemoveMax();
}
return result;
}
int main()
{
int a[] = {5,3,7,2,6,8,4,9,19,50,18,16};
int *x = min(a, 12, 5);
for (int i = 0; i < 5; i++)
cout<<x[i]<<' ';
cout<<endl;
delete[] x;
return 0;
}
相关文章推荐
- 程序员面试题精选100题(05)-查找最小的k个元素[算法]
- 程序员面试题精选100题(05)-查找最小的k个元素
- 微软算法100题05 查找最小的k 个元素
- 程序员面试题精选100题(05)-查找最小的k个元素
- 【从零单排之微软面试100题系列】05之查找最小的k个元素
- 程序员面试题精选100题(05)-查找最小的k个元素
- 程序员面试题精选100题(05)-查找最小的k个元素[算法]
- Microsoft100——05.查找最小的k个元素
- 程序员面试题精选100题(05)-查找最小的k个元素
- 查找最小的k个元素 【微软面试100题 第五题】
- IT公司100题-5-查找最小的k个元素
- 查找最小的k个元素 【微软面试100题 第五题】
- 微软100题(5) 查找最小的k个元素
- To_10_r_100_5---查找最小的K个元素
- 程序员面试题100题第05题——查找最小的K个元素
- 【100题】查找最小的k个元素
- [程序员面试题精选100题]5.查找最小的k个元素
- (微软面试100题)查找最小的K个元素
- 微软面试100题目之5 查找最小的k个元素
- 面试100题:5.查找最小的k个元素