堆排序(C#)

堆排序(C#)

(二叉)堆數據結構是一種數組對象,它可以被視爲一顆完全二叉樹.
完全二叉樹(Complete Binary Tree)
若設二叉樹的高度爲h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的節點都連續集中在最左邊,這就是完全二叉樹。 
完全二叉樹是由滿二叉樹而引出來的。對於深度爲K的,有N個結點的二叉樹,
當且僅當其每一個結點都與深度爲K的滿二叉樹中編號從1至n的結點一一對應時稱之爲完全二叉樹。
(完全二叉樹)
在堆中對於某一節點i,如果它有左右兒子,則左兒子Left(i)的索引(從0開始)爲i*2+1,
右兒子Right(i)的索引爲i*2+2,節點i的父節點索引爲(i-1)/2.
代碼如下:
  1. /// <summary>  
  2. ///  最小堆排序(升序)  
  3. /// </summary>  
  4. public static int[] MinHeapSort(int[] a)  
  5. {  
  6.     // 將數組構建爲最小堆  
  7.     BulidMinHeap(a);  
  8.   
  9.     int aLenght = a.Length;  
  10.     int heapSize = aLenght;  
  11.     int[] sorttedArray = new int[a.Length];  
  12.     for (int i = 0; i < aLenght; i++)  
  13.     {  
  14.         // 將根節點的最小值取出  
  15.         sorttedArray[i] = a[0];  
  16.         a[0] = a[heapSize - 1];  
  17.   
  18.         MinHeapify(a, 0, heapSize--);  
  19.     }  
  20.   
  21.     return sorttedArray;  
  22. }  
  23.   
  24. /// <summary>  
  25. /// 將數組構建爲最小堆  
  26. /// </summary>  
  27. public static void BulidMinHeap(int[] a)  
  28. {  
  29.     for (int i = a.Length / 2 - 1; i >= 0; i--)  
  30.     {  
  31.         MinHeapify(a, i, a.Length);  
  32.     }  
  33. }  
  34.   
  35. /// <summary>  
  36. /// 調整二叉堆,即將以i爲根節點的二叉樹調整爲最小堆  
  37. /// </summary>  
  38. public static void MinHeapify(int[] a, int i, int heapSize)  
  39. {  
  40.     int left = i * 2 + 1;// 左兒子的索引  
  41.     int right = i * 2 + 2;// 右兒子的索引  
  42.     int mivValueIndex = i;// 保存最小值的索引  
  43.   
  44.     if (left < heapSize && a[i] > a[left])  
  45.     {  
  46.         // 左兒子小於當前節點,則記錄做兒子的索引,作爲最小值索引  
  47.         mivValueIndex = left;  
  48.     }  
  49.     if (right < heapSize && a[mivValueIndex] > a[right])  
  50.     {  
  51.         // 右兒子小於當前節點,則記錄做兒子的索引,作爲最小值索引  
  52.         mivValueIndex = right;  
  53.     }  
  54.   
  55.     if (mivValueIndex != i)  
  56.     {  
  57.         // 交換根和子節點值  
  58.         int temp = a[i];  
  59.         a[i] = a[mivValueIndex];  
  60.         a[mivValueIndex] = temp;  
  61.   
  62.         // 遞歸處理子樹  
  63.         MinHeapify(a, mivValueIndex, heapSize);  
  64.     }  
  65. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章