(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个关键函数的主要内容,如果未能解决你的问题,请参考以下文章