堆排序,其實就是用陣列儲存,利用完全二叉樹的性質,對其進行二叉樹的操作,通過構建大頂堆(小頂堆),找到最大值(最小值),與最後乙個節點交換,然後總個數減一,然後重複此操作,最後得到有序序列。(如果不理解大頂堆與小頂堆的話,建議先看看)
基本思路是:1,構建出始堆;2,將堆頂元素與最後乙個節點交換;3,遞迴此操作。
感覺思路很簡單是吧 ,那就直接上**
1 #include
2 3 using std::cin;
4 using std::cout;
5 using std::endl;
6 7 #define max 100
8 9 #define swap(a, b)
13 14 void updata_heap(int arr, int father, int n)
22 if(rchild < n && arr[rchild] > arr[max_index])
25 if(max_index != father)
29 }
30 return ;
31 }
3233 void heap_build(int arr, int n)
37 }
38 39 void heap_sort(int arr, int n)
47 48 }
49 50 void output(int arr, int n)
55 cout << endl;
56 return ;
57 }
58 59 int main()
68 heap_sort(arr, n);
69 output(arr, n);
70 return 0;
71 }
!!!需要注意的是,陣列從0開始和從1開始左右孩子的標號會有變化,這個是從0下標開始的。
結果如下:
堆排序解析
首先要了解堆的性質,我這裡簡答總結一下 這裡說的是小堆 1 堆是一棵完全二叉樹 2 對於大堆中的任何乙個非葉子節點,節點的值必須小於左右孩子節點值。由此可知,對於小堆而言,根節點就是最小值了,那麼我們每次拿走根節點,拿走的順序就是遞增序列的。排序的元素在陣列中,而堆也是一棵完全二叉樹,所以直接用陣列...
堆排序演算法解析
堆排序是利用堆的性質進行的一種選擇排序。下面先討論一下堆。11.堆堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字...
堆排序演算法解析
首先來引入乙個例子 如何使用選擇排序?肯定是每一次遍歷然後把大的放到最後面。當然,前面也可以 我感覺堆排序其實和選擇差不多。堆排序也是每次取出最大值,然後把最大值放後面 但是想學會堆排序,首先要知道什麼是堆 堆的定義 邏輯上 乙個完全二叉樹 物理上 借助向量實現 為什麼能用乙個向量來間接的弄乙個完全...