堆排序 堆排序是另一種選擇排序方法,它是樹型選擇排序的改進,它使用的輔助空間較少,僅需要一個元素用于空間交換。 堆:根結(jié)點的關(guān)鍵碼值或者大于左右子樹或者都小于左右子樹,而且左右子樹也是堆。 如果每個結(jié)點的值都大于左右子樹關(guān)鍵碼值,稱之為大頂堆。每個結(jié)點的值都小于左右子樹的關(guān)鍵碼值,稱之為小頂堆。 首先,堆是一個完全二叉樹。堆排序包含兩個過程: (1)初建堆 (2)調(diào)整堆
調(diào)整堆:對于第二個過程,描述如下,第一次,取出堆頂元素與R[n]進行交換,然后從根結(jié)點開始調(diào)整堆,根結(jié)點與左右孩子中較大者交換,這樣,左右子樹的堆會被破壞,繼續(xù)進行上述操作,直到葉子結(jié)點為止。第二次,取出堆頂元素與R[n-1]交換,然后調(diào)整堆。 初建堆:從非終端結(jié)點開始一直到根結(jié)點,執(zhí)行調(diào)整堆的過程。這樣,就會建立一個大頂堆。
如果排序過程中,是按照從小到大正序,那么建立一個大頂堆。如果是逆序就建立一個小頂堆。
堆排序算法的JAVA實現(xiàn): /** //調(diào)整堆 public static void adjustHeap(int[] num, int s, int t) { int i = s; } num[i] = x; }
public static void heapsort(int[] num, int n) { int i; adjustHeap(num, i, n);//初始堆過程 for (i = n; i > 1; i--) { } } }
性能分析: 時間復雜度: 堆是一個完全二叉樹,設(shè)樹高為k=log2n+1,從根到葉的調(diào)整,關(guān)鍵碼比較的次數(shù)為2(k-1),交換的次數(shù)至多為k次。所以比較的次數(shù)不超過 2*(log2(n-1)+log2(n-2)+....+log22)<2nlog2n 而比較的次數(shù)不超過4n.所以堆排序的時間復雜度為O(nlogn). 空間復雜度: 需要一個單元的輔助空間用于交換,所以輔助空間為O(1). 穩(wěn)定性: 堆排序調(diào)整過程中存在著交換,所以堆排序是一個不穩(wěn)定的排序算法。 堆排序的實例過程可以參考http://blog.sina.com.cn/s/blog_534408920100acqv.html.
|
|