#includevoid 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 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.堆排序分为两步:
首先,先进行堆化,也就是形成有序的堆,使乱序的单独数值形成从上到下依次减小的堆
要注意,从小到大进行堆化;
其次,就是对数值进行排序,从小到大排序,由对堆的性质的得最上边是最大值,最下边是最小值,且最小值对应的是最大下标,交换数值之后刚好可以得到最大元素。
注意:这时交换完位置之后,要再次对被交换过去的元素进行堆化,这样才能保证每次最顶端都是堆的最大值;而这次的堆化与是上面的堆化不太一样,这个堆化是从上边递归开始的,上面的堆化是从最下边的父节点开始的,因为只有这样才能保证将大的数值不断的往上传递,如果从上边开始
就不能保证最上边是最大值。



