题目描述
编写程序,实现堆排序
输入
记录个数
记录1 记录2 记录3 …,
输出
记录x1 记录x2 记录x3 …
样例输入
10
42 18 35 41 90 65 49 19 53 75
样例输出
18 19 35 41 42 49 53 65 75 90
代码如下:
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
void siftDown(int* L, const int start, const int m)
{
int i = start;
int j = 2*i+1; //j是i的左子女
int temp=L[i]; //暂存子树根结点
while (j <= m) //逐层比较
{
if (j < m && L[j] < L[j+1]) //让j指向两子女中的大者
{
j++;
}
if (temp >= L[j]) //temp排序码大不调整
{
break;
}
else //否则子女中的大者上移
{
L[i] = L[j];
i = j;
j = 2*j+1; //i下降到子女位置
}
}
L[i] = temp; //temp放到合适位置
}
void Swap(int *a,int s,int e)
{
int temp;
temp=a[s];
a[s]=a[e];
a[e]=temp;
}
void HeapSort(int *L, int left, int right)
{
int i, n = right - left + 1;
for (i = (n-2)/2; i >= 0; i--) //将表转换为堆
{
siftDown(L, i, n-1);
}
for (i = n-1; i >= 0; i--) //对表排序
{
Swap(L,0,i);
siftDown(L, 0, i-1);
}
}
int main()
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
HeapSort(a,0,n-1);
for(int i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[n-1];
}