排序
Time Limit: 1000ms Memory limit: 32678K 有疑问?点这里^_^
题目描述
给你N(N<=100)个数,请你按照从小到大的顺序输出。
输入
输入数据第一行是一个正整数N,第二行有N个整数。
输出
输出一行,从小到大输出这N个数,中间用空格隔开。
示例输入
51 4 3 2 5
示例输出
1 2 3 4 5
思路:堆实际上是一棵完全二叉树,堆又分为大顶堆和小顶堆,小顶堆满足性质其任何一非叶节点不大于其左右孩子节点的关键字。大顶堆则相反,即任何一非叶节点不小于其左右孩子节点的关键字。利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,每次从无序中选择最大记录(最小记录),到最后即得到有序数组
代码:
#include <iostream>
#include<string.h>
using namespace std;
int len,large,n;
int heapify(int a[],int i)
{
if(2*i<=len&&a[2*i]>a[i])
large=2*i;
else large=i;
if(2*i+1<=len&&a[2*i+1]>a[large])
{
large=2*i+1;
}
if(large!=i)
{
swap(a[i],a[large]);
heapify(a,large);
}
return 0;
}
int build(int a[])
{
int i;
for(i=n/2;i>=1;i--)
{
heapify(a,i);
}
}
int heapsort(int a[])
{
int i;
build(a);
for(i=n;i>=2;i--)
{
swap(a[i],a[1]);
len--;
heapify(a,1);
}
return 0;
}
int main()
{
int i,a[110];
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
len=n;
heapsort(a);
for(i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
//cout << "Hello world!" << endl;
return 0;
}