堆排序算法_2011_10_10

//堆排序
voidadjustHeap(int R[], inti, int m)
{
       int nTemp = R[i];
       int j= (2 * i) + 1;//即使是根节点,那么左孩子的的序号为i+ 1,右孩子的序号为i +  2,这样就可以让r[0]也加入进来
      
       while (j <= m)
       {
              if ((j< m)&& (R[j] < R[j + 1]))
              {
                     j++;
              }
 
              if (nTemp < R[j])
              {
                     R[i] = R[j];
                     i = j;//
                     j = (2 * i) + 1;//这里之所以要这么赋值是因为,当你根结点和子结点交换元素以后,那么子树可能就不是大根堆或者小根堆了,
    //那么你就要跑回去检查看是否依然是大(小)根堆
              }
              else
              {
                     break;
              }
 
              R[i] = nTemp;
       }
}
 
 
voidheapSort(int r[],intn)
{
       int nTemp = 0;
      
       //之所以是n/2 – 1是因为不要浪费r[0]这个空间
       for (inti = (n / 2) - 1; i >= 0; i--)
       {
              adjustHeap(r, i, n - 1);
       }
 
       for (inti = n - 1; i >= 0; i--)
       {
              nTemp = r[0];
              r[0] = r[i];
              r[i] = nTemp;
 
              adjustHeap(r, 0, i - 1);
       }
             
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值