(C++)堆排序的3个关键函数

Posted CSU迦叶

tags:

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

堆排序:指使用堆结构对一个序列进行排序。所以,首先要有一个堆结构。

此处讨论递增排序。以及用最大堆。

注意:让存放堆的数组作为全局变量,n为元素个数,数组存放元素从下标1开始,n结束。

int heap[11] = {100,8,6,5,7,2,3,5,2,6,1};
int n = 10;//元素个数,也是最后一个元素的下标 

1. 向下调整函数

一句话概括:层级下降,尽量举贤,直至不可降。

基本思想:总是将low结点和它的左右孩子比较,和左右孩子中较大的那个互换位置,互换之后仍不放过,继续和新的左右孩子互换位置,直至low结点比左右孩子都大或者没有左右孩子了。

void downAdjust(int low,int high){
	int i = low;//调整完之后该位置为当前子树的最大结点
	int j = i*2;//根据完全二叉树的性质,j是i的左子结点 
	while(j<=high){
		//首先是i的两个子结点进行比较
		if(j+1<=high&&heap[j]<heap[j+1])j=j+1;
		
		//让i和两孩子中的优胜者比较
		if(heap[i]<heap[j]){
			swap(heap[i],heap[j]);
			i = j;//然后开始新一轮 
			j = i*2;
		}else break;//说明i在本轮比较中赢了,降至不可再降 
		
	}
}

2.建堆函数

基本思想:从第一个非叶子结点(n/2向下取整)开始,倒着遍历,逐个向下调整,每次调整都会让最大值到当前子树。

void createHeap(){
	for(int i=n/2;i>=1;i--){
		downAdjust(i,n); 
	}
} 

3.堆排序函数

基本思想:建堆,从最后一个元素开始倒着枚举,总是让堆顶和最后一个元素交换,然后调整堆顶,直到只剩下一个未排序的元素。

帮助理解:每次遍历都固定最后一个元素的位置不动。

void heapSort(){
	createHeap();
	for(int i=n;i>1;i--){
		swap(heap[1],heap[i]);
		downAdjust(1,i-1);
	}
}

以上是关于(C++)堆排序的3个关键函数的主要内容,如果未能解决你的问题,请参考以下文章

最小的K个数 C++(BFPRT,堆排序)

python代码实现堆排序

inline内联函数

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

堆排序代码

堆排序算法的实现