天天看點

【愚公系列】2021年11月 C#版 資料結構與算法解析(選擇排序-堆排序)

1、堆排序(Heap Sort)

堆排序(Heapsort)是指利用堆這種資料結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子結點的鍵值或索引總是小于(或者大于)它的父節點。

1.1 算法描述

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

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

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

1.2 動圖示範

【愚公系列】2021年11月 C#版 資料結構與算法解析(選擇排序-堆排序)

1.3 代碼實作

/// <summary>

/// 堆排序

/// </summary>

public class Program {

   public static void Main(string[] args) {

       int[] array = { 43, 69, 11, 72, 28, 21, 56, 80, 48, 94, 32, 8 };

       HeapSort(array);

       ShowSord(array);

       Console.ReadKey();

   }

   private static void ShowSord(int[] array) {

       foreach (var num in array) {

           Console.Write($"{num} ");

       }

       Console.WriteLine();

   private static void HeapSort(int[] array) {

       MaxHeap(array);

       for (int i = array.Length - 1; i > 0; i--) {

           Swap(ref array[0], ref array[i]);

           Heapify(array, 0, i);

   private static void MaxHeap(int[] array) {

       for (int i = array.Length / 2 - 1; i >= 0; i--) {

           Heapify(array, i, array.Length);

   private static void Heapify(int[] array, int index, int size) {

       int left = 2 * index + 1;

       int right = 2 * index + 2;

       int large = index;

       if (left < size && array[left] > array[large]) {

           large = left;

       if (right < size && array[right] > array[large]) {

           large = right;

       if (index != large) {

           Swap(ref array[index], ref array[large]);

           Heapify(array, large, size);

   private static void Swap(ref int first, ref int second) {

       int t = first;

       first = second;

       second = t;

}

堆排序算法的時間複雜度不難證明為: O(n*logn) 。

繼續閱讀