堆排序算法的C++实现

Posted mingogo乔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序算法的C++实现相关的知识,希望对你有一定的参考价值。

复杂度:时间复杂度为O(n*log(n)), 非稳定排序,原地排序(空间复杂度O(1))

1. 对第i个父节点进行堆排序,条件:当前父节点下面层的所有非叶子节点都已完成堆排序

前情知识:使用数列表示树,对于第i个数,
它的根节点为 parent = (i-1)/2,取整
两个子节点分别为 2i+1 和 2i+2

template<class T>
void swap(T data[], int a, int b){
	T temp = data[a];
	data[a] = data[b];
	data[b] = temp;
}
void heapify(T data[], int i, int size){
	if(i >= size){
		return;
	}
	//对当前子堆进行堆排序,找到最大值
	int max = i;
	if(2i+1 < size && data[2i+1] > data[max]){
		max = 2i+1;
	}
	if(2i+2 < size && data[2i+2] > data[max]){
		max = 2i+2;
	}
	if(max != i){
		swap(data, i, max);
		//进行交换后,可能破坏了已经完成的下层堆排序,需要对交换过的节点进行,进行一个推排序递归
		heapify(dada, max, size);
	}
	
}

2. 从底向上的对父节点依此进行堆排序(保证1的条件),完成堆的构建

前情知识:最后一个根节点,也就是最后一个节点的parent节点,为size/2-1(取整)。

template<class T>

void buildheap(T data[], int size){
	for (int i = size/2-1; i >= 0; --i){
		heapify(data, i, size);
	}
}

3. 将最大值(根节点)和最后一个节点进行交换,砍断最大值,不断进行堆构建,即可从小到大排序

template<class T>

void heapsort(T data[], int size){
	buildheap(data, size);
	for (size; size > 0; --size){
		swap(data, 0, size);
		buildheap(data, size-1);
	}
}

以上是关于堆排序算法的C++实现的主要内容,如果未能解决你的问题,请参考以下文章

堆排序算法的C++实现

堆排序算法的C++实现

堆排序算法的C++实现

算法笔记 排序算法完整介绍及C++代码实现 HERODING的算法之路

Java排序算法 - 堆排序的代码

急需C++实现的Apriori算法代码