堆排序

-堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。 需要注意的是排升序要建大堆,排降序建小堆。

堆排序首先要建堆(利用向下调整算法),其次是在堆里面选数(让很节点上的最大数与最后一个叶子上的数交换,然后拿出最后一个数,每拿出一个数,都要进行一次调堆,保证是按有序数列存放在二叉树中)。

//size表示:树的大小
void Adjustdown (int* a, int size,int root){
  int parent = root;
  inr child = parent*2+1;//默认是左边的孩子。
  while (child < size){//当孩子在有效节点范围内时。
    if (a[child+1]>a[child] && child+1 < size){
      ++child;
     }
    if (a[child]>a[parent]){
      Swap (&a[child],&a[parent]);
      parent = child;
      child = parent*2+1;
     }
    else{
      break;
     }
   }
  }
 
 void HeapSort (int* a, int n){
 //建大堆
    for (int i=(n-1-1)/2; i>=0; i--){
      Adjustdown (a,n,i);
     }
    // 选数(每次把最大的数调到最后一个位置)
    int end = n-1;
    while (end>0){
      Swap(&a[0],&a[end]);
      Adjustdown (a,end,0);//选好一个数以后,要对剩下的数据向下调整,保证有序
      end--;
     }
   }
    
void Swap (int* x,int* y){
  int tmp = *x;
  *x = *y;
  *y = tmp;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值