• 堆排序


     1         #region 堆排序
     2         /// <summary>
     3         /// array是待调整的堆数组
     4         /// i是待调整的数组元素的位置,length是数组的长度
     5         /// </summary>
     6         /// <param name="array"></param>
     7         /// <param name="i"></param>
     8         /// <param name="nLength"></param>
     9         private static void HeapAdjust(int[] array, int i, int nLength)
    10         {
    11             int nChild, nTemp;
    12 
    13             for (nTemp = array[i]; 2 * i + 1 < nLength; i = nChild)
    14             {
    15                 // 子结点的位置是 父结点位置 * 2 + 1
    16                 nChild = 2 * i + 1;
    17 
    18                 // 得到子结点中较大的结点
    19                 if (nChild != nLength - 1 && array[nChild + 1] > array[nChild])
    20                     ++nChild;
    21 
    22                 // 如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点
    23                 if (nTemp < array[nChild])
    24                 {
    25                     array[i] = array[nChild];
    26                 }
    27                 else    // 否则退出循环
    28                 {
    29                     break;
    30                 }
    31             }
    32 
    33             // 最后把需要调整的元素值放到合适的位置
    34             array[i] = nTemp;
    35             ConsoleArray("调整堆排序", array);
    36         }
    37 
    38         /// <summary>
    39         /// 堆排序算法
    40         /// </summary>
    41         /// <param name="array"></param>
    42         /// <param name="length"></param>
    43         private static void HeapSort(int[] array, int length)
    44         {
    45             ConsoleArray("排序前",array);
    46             // 调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
    47             for (int i = length / 2 - 1; i >= 0; --i)
    48             {
    49                 HeapAdjust(array, i, length);
    50             }
    51 
    52             // 从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
    53             for (int i = length - 1; i > 0; --i)
    54             {
    55                 // 把第一个元素和当前的最后一个元素交换,
    56                 // 保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
    57                 Swap(array[0], array[i]);
    58 
    59                 // 不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
    60                 HeapAdjust(array, 0, i);
    61             }
    62 
    63             //ConsoleArray("堆排序", array);
    64         }
    65 
    66         /// <summary>
    67         /// 交换函数
    68         /// </summary>
    69         /// <param name="a">元素a</param>
    70         /// <param name="b">元素b</param>
    71         private static void Swap(int a,int b)
    72         {
    73             int temp = 0;
    74             temp = a;
    75             a = b;
    76             b = temp;
    77         }
    78         #endregion
    工欲善其事,必先利其器。
  • 相关阅读:
    解决mysqldump: Got error: 1044: Access denied for user
    Ubuntu技巧之 is not in the sudoers file解决方法
    mysql日志详细解析
    linux利用grep查看打印匹配的下几行或前后几行的命令
    Linux无法使用userdel删除用户和组的解决办法
    ubuntu快速清理磁盘垃圾
    smarty中math函数的用法
    metinfo首页内容简介
    linux命令别名的使用
    mysql 导出表结构和表数据 mysqldump用法
  • 原文地址:https://www.cnblogs.com/zhangzhu/p/2836155.html
Copyright © 2020-2023  润新知