堆排序

 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
工欲善其事,必先利其器。
原文地址:https://www.cnblogs.com/zhangzhu/p/2836155.html