#include<stdio.h>
void Swap(int *a,int *b){//交换函数
int t;
t=*a;
*a=*b;
*b=t;
}
void Print(int a[],int n){//打印函数
int i;
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
void Heapify(int a[],int n,int i){//
int largest=i;
int lson=i*2+1;
int rson=i*2+2;
if(lson<n&&a[largest]<a[lson])
largest=lson;
if(rson<n&&a[largest]<a[rson])
largest=rson;
if(largest!=i){
Swap(&a[largest],&a[i]);
Heapify(a,n,largest);
}
}
void Heap_Sort(int a[],int n){
int i;
//建堆 ,从拥有左右孩子的父亲开始i=(n-1)/2到0下标,建立的堆是上边大,下边小
for(i=(n-1);i>=0;i--){
Heapify(a,n,i);
}
//排序,在建好堆的基础上将最大值给交换出来
for(i=(n-1);i>0;i--){
Swap(&a[i],&a[0]);
Heapify(a,i,0); //交换完又得重新使堆变得有序,也可以叫做重新建堆
}
}
int main()
{
int a[9]={5,2,6,1,9,3,7,8,4};
Print(a,9);
Heap_Sort(a,9);
Print(a,9);
return 0;
}
以上便是我看完 up主 写完的代码
比我们数据结构书上的代码简洁 明了多 这位up主的逻辑思路相当清晰,很值得学习。
接下来我谈一谈我的认识:
1.看视频的时候,第一遍可能会看不懂,但是,请坚持下去,多看几遍,我反正看了四五遍
2.堆排序分为两步:
首先,先进行堆化,也就是形成有序的堆,使乱序的单独数值形成从上到下依次减小的堆
要注意,从小到大进行堆化;
其次,就是对数值进行排序,从小到大排序,由对堆的性质的得最上边是最大值,最下边是最小值,且最小值对应的是最大下标,交换数值之后刚好可以得到最大元素。
注意:这时交换完位置之后,要再次对被交换过去的元素进行堆化,这样才能保证每次最顶端都是堆的最大值;而这次的堆化与是上面的堆化不太一样,这个堆化是从上边递归开始的,上面的堆化是从最下边的父节点开始的,因为只有这样才能保证将大的数值不断的往上传递,如果从上边开始
就不能保证最上边是最大值。