堆排序:
1.以数组下标为一颗二叉树的节点编号
2.通过比较交换,把这颗二叉树变成大根堆或小根堆
3将齐根节点首元素与数组最后一个元素交换,缩短数组长度,完成排序。
#include<iostream>
#define N 8
using namespace std;
void M_A_Heap(int *a,int end){//制造一个大根堆
int cnt,t,pa;
while(1){
pa=end/2;//从最后一个双亲节点向第一个节点跑;
cnt=0;//设置标志
while(pa>0){
if(a[pa]<a[2*pa]) {//若左子女比根大交换
t=a[pa];
a[pa]=a[2*pa];
a[2*pa]=t;
cnt=1;
}
if(2*pa+1<=end&&a[pa]<a[2*pa+1]){//若有子女存在且右子女比根大,交换
t=a[pa];
a[pa]=a[2*pa+1];
a[2*pa+1]=t;
cnt=1;
}
pa--;//直到最后一个节点
}
if(!cnt) break;//若某一次遍历没有交换,停下
}
}
void HeapSort(int *a){
int end=N,t;
while(end>1){//将根节点,即最大数放到数组最后,缩短数组长度;
M_A_Heap(a,end);
t=a[1];
a[1]=a[end];
a[end]=t;
end--;
}
}
int main(void){
int a[N+1]={0,3,2,5,8,4,7,6,9};
HeapSort(a);
for(int i=1;i<N+1;i++){
cout<<a[i]<<"\t";
}
return 0;
}