堆排序算法的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++实现8 堆排序 难点分析

希尔排序算法的C++实现

希尔排序算法的C++实现

希尔排序算法的C++实现

希尔排序算法的C++实现