最小堆排序法

以下方法是倒叙排序

void HeapSort(int * a, int size )
{

 //首先将数组堆化
     int i;
     for(i=1; i<size ; ++i)
     {
          //i=1时,表示往堆里增加了一个元素
          int index = i;
          while(index>0)
          {
               int pindex = (index-1)/2; //求出父节点下标
               if(a[pindex] > a[index] )
               {
                    a[pindex]=a[pindex]^a[index];
                    a[index]=a[pindex]^a[index];
                    a[pindex]=a[pindex]^a[index];
                    index=pindex;//继续检查堆的合法性
               }
                       else
                    break;
          }
     }
     //删除头节点,放到尾部
     for(i=0; i<size-1 ; ++i)
     {
          int tail=size-1-i;
          int head = 0;

          a[tail]=a[tail]^a[head];
          a[head]=a[tail]^a[head] ;
          a[tail]=a[tail]^a[head];

          int heapsize=tail;
           while(1)
           {
                int left=head*2+1;
                int right=head*2+2;
                int x;
                if(left>=heapsize)
                         break;
                 if(right>=heapsize)
                         x=left;
                  else
                   {
                         if(a[left]<a[right])
                              x=left;
                         else
                              x=right;
                   }
                   if(a[head]>a[x])
                   {
                         a[head]=a[head]^a[x];
                         a[x]=a[head]^a[x];
                         a[head]=a[head]^a[x];
                                         head=x;
                   }
                    else
                         break;
           } 
      }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值