排序算法之堆排序

算法思想:堆的定义:source[i]<=source[2*i] && source[i]<= source[2*i+1]    或  source[i]>=source[2*i] && source[i]>= source[2*i+1];

                    堆排序思想:(1)将待排序序列建成堆;(2)取堆的第一个元素,作为序列的最后一个元素,

                                             并将剩下的元素重新建成堆;(3)重复第二步直到序列结束。


C#实现:

 /// <summary>
       /// 堆排序
       /// </summary>
       /// <param name="source">待排序序列</param>
       private void HeapSort(int[] source)
       {
           for (int i = source.Length / 2; i >= 0;i-- )
           {
               HeapAdjust(source, i, source.Length);
           }

           for (int j = source.Length - 1; j >= 0;j-- )
           {
               int temp = source[0];
               source[0] = source[j];
               source[j] = temp;

               HeapAdjust(source, 0, j);
           }
       }

       /// <summary>
       /// 调整为堆
       /// </summary>
       /// <param name="soure">待排序序列</param>
       /// <param name="i">序列中的第i个元素</param>
       /// <param name="len">排序序列的长度</param>
       private void HeapAdjust(int[] soure,int i,int len)
       {
           int index = 0;

           for (int j = i; 2 * j + 1 < len - 1; j=index)
           {
               index = 2*j + 1;  //左子节点编号

               if(index<len-1 && soure[index]<soure[index+1])//找出左子节点和右子节点中较大的。
               {
                   index++;
               }

               if(soure[index]>soure[j]) //比较根节点和较大子节点,如果根节点较小则交换
               {
                   int temp = soure[index];
                   soure[index] = soure[j];
                   soure[j] = temp;
               }
           }

       }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值