排序算法——堆排序 Heapsort

堆排序(Heapsort)是指利用堆進行排序的一種排序算法。堆是一種近似完全二叉樹的結構,它的最大特點是對於最小堆,任何子節點的鍵值總是大於它的父節點;而對於最大堆,任何子節點的鍵值總是小於它的父節點。

堆通常可用數組表示,如果數組第一個元素的下標設爲0,那麼父節點i的左子節點位置爲(28i+1),父節點i的右子節點位置爲(2*i+2),子節點i的父節點位置爲floor((i-1)/2)。

以最大堆爲例,根據堆的定義,顯然根節點的鍵值總是最大的。堆排序的算法描述如下

(1)創建最大堆:即根據一系列輸入數據構建一個最大堆;

(2)調整最大堆(MaxHeapify):顯然現在堆頂元素是最大的,我們取走其堆頂元素同時使堆的大小減小1,然後調整堆,使其重新變成最大堆。通常的調整方法是把堆的最後一個元素放到堆頂,頂替被取走的元素,然後自上而下的調整,使得整個堆重新變成最大堆;

(3)不斷重複第二步,直到堆大小減小到0,就得到輸入數據的有序序列了。

堆排序算法的時間複雜度爲O(nLogn)。

C++實現

#include <iostream>
using namespace std;
 
// To heapify a subtree rooted with node i which is
// an index in arr[]. n is size of heap
void heapify(int arr[], int n, int i)
{
    int largest = i;  // Initialize largest as root
    int l = 2*i + 1;  // left = 2*i + 1
    int r = 2*i + 2;  // right = 2*i + 2
 
    // If left child is larger than root
    if (l < n && arr[l] > arr[largest])
     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章