用堆排序实现查找最小的K个元素
2013-08-25 17:30
211 查看
转载自:http://blog.chinaunix.net/uid-28977986-id-3864505.html
2013-08-24 19:25:51
分类: C/C++
题目:查找最小的k个元素。
利用堆排序解决这个问题的思路有两种:
思路 1:将输入的n个数建立成大顶堆并排序后,再遍历输出前k个元素,此k个元素即使最小的K个元素。
思路2: 维护k个元素的最大堆,即用容量为k的最大堆存储最先遍历到的k个数,并假设他们是最小的k个数。继续遍历数列,每次遍历到一个元素,将它与堆顶元素比较,若小于堆顶元素,更新堆,否则,不更新堆。
思路1的代码和实现堆排序的代码相同。
思路2的代码实现如下:
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
void HeapAdjust(int a[],int i,int k)
{
int lchild,rchild;
int max=i;
lchild=2*i;
rchild=2*i+1;
if(i<=k/2)
{
if(lchild<=k && a[lchild]>a[max])
max=lchild;
if(rchild<=k && a[rchild]>a[max])
max=rchild;
if(max!=i)
{
swap(a[max],a[i]);
HeapAdjust(a,max,k);
}
}
}
int main()
{
int i,j,k,size;
int a[100];
printf("please input the size of heap:");
while(scanf("%d",&size)==1 && size>0)
{
printf("请输入堆的元素值:");
for(i=1;i<=size;i++)
scanf("%d",&a[i]);
printf("请输入k的值");
scanf("%d",&k);
for(i=k/2;i>=1;i--)
HeapAdjust(a,i,k);
for(j=k+1;j<=size;j++)
{
if(a[j]<a[1])
{
a[1]=a[j];
HeapAdjust(a,1,k);
}
}
for(i=1;i<=k;i++)
cout<<a[i]<<"
";
}
return 0;
}
2013-08-24 19:25:51
分类: C/C++
题目:查找最小的k个元素。
利用堆排序解决这个问题的思路有两种:
思路 1:将输入的n个数建立成大顶堆并排序后,再遍历输出前k个元素,此k个元素即使最小的K个元素。
思路2: 维护k个元素的最大堆,即用容量为k的最大堆存储最先遍历到的k个数,并假设他们是最小的k个数。继续遍历数列,每次遍历到一个元素,将它与堆顶元素比较,若小于堆顶元素,更新堆,否则,不更新堆。
思路1的代码和实现堆排序的代码相同。
思路2的代码实现如下:
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
void HeapAdjust(int a[],int i,int k)
{
int lchild,rchild;
int max=i;
lchild=2*i;
rchild=2*i+1;
if(i<=k/2)
{
if(lchild<=k && a[lchild]>a[max])
max=lchild;
if(rchild<=k && a[rchild]>a[max])
max=rchild;
if(max!=i)
{
swap(a[max],a[i]);
HeapAdjust(a,max,k);
}
}
}
int main()
{
int i,j,k,size;
int a[100];
printf("please input the size of heap:");
while(scanf("%d",&size)==1 && size>0)
{
printf("请输入堆的元素值:");
for(i=1;i<=size;i++)
scanf("%d",&a[i]);
printf("请输入k的值");
scanf("%d",&k);
for(i=k/2;i>=1;i--)
HeapAdjust(a,i,k);
for(j=k+1;j<=size;j++)
{
if(a[j]<a[1])
{
a[1]=a[j];
HeapAdjust(a,1,k);
}
}
for(i=1;i<=k;i++)
cout<<a[i]<<"
";
}
return 0;
}
相关文章推荐
- 用堆排序实现查找最小的K个元素 java
- 查找最小的k 个元素之C#算法实现
- 查找最小的k个元素-堆的实现方法(下)
- 查找最小的k个元素 C++实现
- 5.查找最小的k个元素
- 算法数据结构C++实现7 - 同时查找最大值和最小值优化算法
- 算法题12 查找最小的k个元素
- 查找最小的k 个元素
- PHP查找数组中只出现一次的数字实现方法【查找特定元素】
- [程序员面试题精选100题]5.查找最小的k个元素
- 无序数组同时查找最大和最小的元素
- 寻找前k个最小元素——用最小堆实现…
- 每天一算法(查找最小的k个元素(数组))
- 面试题15 - 查找最小的 k 个元素 [数组] / (堆优化 STL O(nlogk) )[STL]
- 面试100题:5.查找最小的k个元素
- SparkSQL实现查找Hive表集合中的多个元素匹配
- 查找栈中最小元素,时间复杂度为0
- 微软算法100道题-----查找最小的k个元素
- 原生js实现查找/添加/删除/指定元素的class
- 数据结构练习(04)查找最小的k个元素