C# 堆排序

來源:互聯網
上載者:User
C# 堆排序

using System;  using System.Collections;  namespace Sort  {      public class HeapSorter      {          public static int[] Sort(int[] sortArray)          {              BuildMaxHeap(sortArray);              for (int i = (sortArray.Length - 1); i > 0; i--)              {                  Swap(ref sortArray[0], ref sortArray[i]); // 將堆頂元素和無序區的最後一個元素交換                  MaxHeapify(sortArray, 0, i); // 將新的無序區調整為堆,無序區在變小                          }              return sortArray;          }          /// <summary>          /// 初始大根堆,自底向上地建堆          /// 完全二叉樹的基本性質,最底層節點是 n/2,所以從 sortArray.Length / 2 開始          /// </summary>          private static void BuildMaxHeap(int[] sortArray)          {              for (int i = (sortArray.Length / 2) - 1; i >= 0; i--)              {                  MaxHeapify(sortArray,i, sortArray.Length);              }          }          /// <summary>          /// 將指定的節點調整為堆          /// </summary>          /// <param name="i">需要調整的節點</param>          /// <param name="heapSize">堆的大小,也指數組中無序區的長度</param>          private static void MaxHeapify(int[] sortArray, int i, int heapSize)          {              int left = 2 * i + 1; // 左子節點              int right = 2 * i + 2; // 右子節點              int larger = i; // 臨時變數,存放大的節點值              // 比較左子節點              if (left < heapSize && sortArray[left] > sortArray[larger])              {                  larger = left;              }              // 比較右子節點              if (right < heapSize && sortArray[right] > sortArray[larger])              {                  larger = right;              }              // 如有子節點大於自身就交換,使大的元素上移。              if (i != larger)              {                  Swap(ref sortArray[i], ref sortArray[larger]);                  MaxHeapify(sortArray, larger, heapSize);              }          }          //數組內元素互換          private static void Swap(ref int a, ref int b)          {              int t;              t = a;              a = b;              b = t;          }      }  }

堆排序的思想:

利用大頂堆(小頂堆)堆頂記錄的是最大關鍵字(最小關鍵字)這一特性,使得每次從無序中選擇最大記錄(最小記錄)變得簡單。

其基本思想為(大頂堆):

1)將初始待排序關鍵字序列(R1,R2....Rn)構建成大頂堆,此堆為初始的無序區;

2)將堆頂元素R[1]與最後一個元素R[n]交換,此時得到新的無序區(R1,R2,......Rn-1)和新的有序區(Rn),且滿足R[1,2...n-1]<=R[n];

3)由於交換後新的堆頂R[1]可能違反堆的性質,因此需要對當前無序區(R1,R2,......Rn-1)調整為新堆,然後再次將R[1]與無序區最後一個元素交換,得到新的無序區(R1,R2....Rn-2)和新的有序區(Rn-1,Rn)。不斷重複此過程直到有序區的元素個數為n-1,則整個排序過程完成。

操作過程如下:

1)初始化堆:將R[1..n]構造為堆;

2)將當前無序區的堆頂元素R[1]同該區間的最後一個記錄交換,然後將新的無序區調整為新的堆。

因此對於堆排序,最重要的兩個操作就是構造初始堆和調整堆,其實構造初始堆事實上也是調整堆的過程,只不過構造初始堆是對所有的非分葉節點都進行調整。


以上就是C# 堆排序的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.