堆排序的是先建立一个完全二叉树,之后调整成一个大顶堆,再进行堆调整的过程!
#include <iostream>
#include <ctime>//时间函数
#include <stdlib.h>
using namespace std;
int h[101];//用来存放堆的数组
int n;//用来存储堆中元素的个数,也就是堆的大小
void swap(int x, int y)
{
int t;
t = h[x];
h[x] = h[y];
h[y] = t;
}
//堆调整函数,完成根节点与左右儿子节点的比较
void HeapAdjust(int *h, int s, int m)
{
int tmp;
int j;
tmp = h[s];
for(j = 2 * s; j <= m; j *= 2)
{
if (j < m && h[j] < h[j + 1])
++j; //j 为关键字中较大的记录的下标
if (tmp >= h[j])
break;
h[s] = h[j];
s = j; //为了下层循环准备
}
h[s] = tmp;
}
void heapsort(int * h)
{ //总体分为两步,建堆和堆调整
int i;
for (i = n / 2; i > 0; i--)
{
HeapAdjust(h, i, n);
}
for (i = n; i > 1; i--)
{
swap(1, i);//将堆顶记录和当前未经排序子序列的最后一个记录交换
HeapAdjust(h, 1, i - 1);
}
}
int main()
{
int i, m;
cin >> m;
for (i = 1; i <= m; i++)
scanf("%d", &h[i]);
n = m;
heapsort( h );
//删除顶部元素,连续删除n次,其实夜就是从大到小把数输出来
for (i = 1; i <= m; i++)
printf("%d ", h[i]);
system("pause");
return 0;
}