选择类排序中的,堆排序

#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.堆排序分为两步:

首先,先进行堆化,也就是形成有序的堆,使乱序的单独数值形成从上到下依次减小的堆

要注意,从小到大进行堆化;

 其次,就是对数值进行排序,从小到大排序,由对堆的性质的得最上边是最大值,最下边是最小值,且最小值对应的是最大下标,交换数值之后刚好可以得到最大元素。

注意:这时交换完位置之后,要再次对被交换过去的元素进行堆化,这样才能保证每次最顶端都是堆的最大值;而这次的堆化与是上面的堆化不太一样,这个堆化是从上边递归开始的,上面的堆化是从最下边的父节点开始的,因为只有这样才能保证将大的数值不断的往上传递,如果从上边开始

就不能保证最上边是最大值。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值