堆排序是指利用堆这种数据结构进行的排序算法,时间复杂度为On * log2(n),和快速排序差不多快。
堆排序
堆是一个近似完全二叉树的结构,这里我们将数组a看成一个完全二叉树的结构,首先创建最大堆,既将堆中的所有数据重新排序,之后进入循环,每次交换a[1]和a[i]的值,因为此时a[1]的值是当前序列中的最大值,就将a[1]放到末尾,然后再对1 ~ (i - 1)所组成的队列进行最大堆调整,既将堆的末端子节点作调整,使得子节点永远小于父节点。这样排序算法就结束了,代码也就自然而然地写出来了。
(PS:NR是指数组元素个数的上限)
# include <cstdio>
# include <iostream>
# include <cmath>
# include <cstring>
# include <algorithm>
using namespace std;
# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)
const int NR = 100000;
int n;
int a[NR + 10];
void maxHeapify(int first, int last){
int dad = first, son = first * 2;
if(son > last) return;
if(son + 1 <= last && a[son] < a[son + 1]) son++;
if(a[dad] > a[son]) return;
swap(a[dad], a[son]);
maxHeapify(son, last);
}
int main()
{
scanf("%d", &n);
FOR(i, 1, n) scanf("%d", &a[i]);
_FOR(i, n / 2, 1) maxHeapify(i, n);
_FOR(i, n, 2){
swap(a[1], a[i]);
maxHeapify(1, i - 1);
}
FOR(i, 1, n) printf("%d ", a[i]);
puts("");
return 0;
}
God Bless You For Ever!