[C#] C#实现堆排序代码 →→→→→进入此内容的聊天室

来自 , 2019-03-18, 写在 C#, 查看 125 次.
URL http://www.code666.cn/view/c82a7178
  1.         //堆排序算法(传递待排数组名,即:数组的地址。故形参数组的各种操作反应到实参数组上)
  2.         private static void HeapSortFunction(int[] array)
  3.         {
  4.             try
  5.             {
  6.                 BuildMaxHeap(array);    //创建大顶推(初始状态看做:整体无序)
  7.                 for (int i = array.Length - 1; i > 0; i--)
  8.                 {
  9.                     Swap(ref array[0], ref array[i]); //将堆顶元素依次与无序区的最后一位交换(使堆顶元素进入有序区)
  10.                     MaxHeapify(array, 0, i); //重新将无序区调整为大顶堆
  11.                 }
  12.             }
  13.             catch (Exception ex)
  14.             { }
  15.         }
  16.  
  17.         /// <summary>
  18.         /// 创建大顶推(根节点大于左右子节点)
  19.         /// </summary>
  20.         /// <param name="array">待排数组</param>
  21.         private static void BuildMaxHeap(int[] array)
  22.         {
  23.             try
  24.             {
  25.                 //根据大顶堆的性质可知:数组的前半段的元素为根节点,其余元素都为叶节点
  26.                 for (int i = array.Length / 2 - 1; i >= 0; i--) //从最底层的最后一个根节点开始进行大顶推的调整
  27.                 {
  28.                     MaxHeapify(array, i, array.Length); //调整大顶堆
  29.                 }
  30.             }
  31.             catch (Exception ex)
  32.             { }
  33.         }
  34.  
  35.         /// <summary>
  36.         /// 大顶推的调整过程
  37.         /// </summary>
  38.         /// <param name="array">待调整的数组</param>
  39.         /// <param name="currentIndex">待调整元素在数组中的位置(即:根节点)</param>
  40.         /// <param name="heapSize">堆中所有元素的个数</param>
  41.         private static void MaxHeapify(int[] array, int currentIndex, int heapSize)
  42.         {
  43.             try
  44.             {
  45.                 int left = 2 * currentIndex + 1;    //左子节点在数组中的位置
  46.                 int right = 2 * currentIndex + 2;   //右子节点在数组中的位置
  47.                 int large = currentIndex;   //记录此根节点、左子节点、右子节点 三者中最大值的位置
  48.  
  49.                 if (left < heapSize && array[left] > array[large])  //与左子节点进行比较
  50.                 {
  51.                     large = left;
  52.                 }
  53.                 if (right < heapSize && array[right] > array[large])    //与右子节点进行比较
  54.                 {
  55.                     large = right;
  56.                 }
  57.                 if (currentIndex != large)  //如果 currentIndex != large 则表明 large 发生变化(即:左右子节点中有大于根节点的情况)
  58.                 {
  59.                     Swap(ref array[currentIndex], ref array[large]);    //将左右节点中的大者与根节点进行交换(即:实现局部大顶堆)
  60.                     MaxHeapify(array, large, heapSize); //以上次调整动作的large位置(为此次调整的根节点位置),进行递归调整
  61.                 }
  62.             }
  63.             catch (Exception ex)
  64.             { }
  65.         }
  66.  
  67.         /// <summary>
  68.         /// 交换函数
  69.         /// </summary>
  70.         /// <param name="a">元素a</param>
  71.         /// <param name="b">元素b</param>
  72.         private static void Swap(ref int a, ref int b)
  73.         {
  74.             int temp = 0;
  75.             temp = a;
  76.             a = b;
  77.             b = temp;
  78.         }
  79. //csharp/7234

回复 "C#实现堆排序代码"

这儿你可以回复上面这条便签

captcha