C++堆排序

堆排序是指利用堆这种数据结构进行的排序算法,时间复杂度为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!

发布了33 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/SkeletonKing233/article/details/100177681