仅做笔记之用,别说我截图教材,看就看,不看就抓紧走,也没碍着你什么,别找不自在
一、图解
二、实现
#include<iostream>
using namespace std;
void Swap(int A[],int x,int y){
int temp=A[x];
A[x]=A[y];
A[y]=temp;
}
void HeapAdjust(int A[],int k,int len){
A[0]=A[k]; //A[0]暂存子树的根结点
for(int i=2*k;i<=len;i*=2){ //沿key较大的子结点向下筛选
if(i<len&&A[i]<A[i+1]){
++i; //取key较大的子结点的下标
}
if(A[0]>=A[i]){ //筛选结束
break;
}else{
A[k]=A[i]; //将A[i]调整到双亲结点上
k=i; //修改k值,以便继续向下筛选
}
}
A[k]=A[0]; //将被筛选结点的值放入最终位置
}
void BuildMaxHeap(int A[],int len){
for(int i=len/2;i>0;--i){
HeapAdjust(A,i,len);
}
}
void HeapSort(int A[], int len){
BuildMaxHeap(A,len); //初始建堆
for(int i=len;i>1;--i){ //n-1趟交换和建堆过程
Swap(A,i,1); //输出堆顶元素(和堆底元素)
HeapAdjust(A,1,i-1); //调整,把剩下的i-1个元素整理成堆
}
}
int main(){
int len=8;
int A[len+1]={0,53,17,78,9,45,65,87,32}; //A[0]舍弃不用
HeapSort(A,len);
for(int i=1;i<=len;++i){
cout<<A[i]<<" ";
}
return 0;
}