堆排序:
它可以看做是完全二叉樹的結構。
分為大根堆和小根堆。如果父節點大於左右節點就是大根堆,父節點小於左右子節點就是小根堆。本文寫大根堆的排序。
設當前節點為i的話:
子節點:2*i+1,2*i+2
父節點:(i-1)/2
概述:
(1)建立大根堆(heapinsert):把當前節點和父節點比較,如果大於父節點,那麼就上公升。如果小於父節點,那麼不做變動。
(2)調整堆(heapify):建立大根堆後,現在的堆每乙個父節點都大於其左右兩個子節點。那麼最頂部就是最大的值。此時應當:
i) 把最頂部的元素和最後乙個元素交換,讓最大的元素處於末尾。
ii) 調整,如果現在最頂部元素的值不是最大值,也就是說,把它和它的左右子節點中大的那個節點比較,如果小於這個子節點,那麼這個子節點和它交換,父節點下沉。
iii) 不斷比較,直至不能下沉為止。然後重複前兩步操作,直至整個陣列排好。
其中排好的標誌:我們先定義個乙個長度表示建立大根堆之後的陣列長度,每一次(2)(i)之後,表示乙個數排好了,那麼這個陣列長度就減去1,如果這個陣列長度為0,那麼排序也就結束了。
時間複雜度:
o(nlogn)
演算法穩定性:
不穩定演算法。
**如下:
#include #include#include
using
namespace
std;
class
heapsort_
;void heapsort_::heapsort(vector &v)
for (int i = 0; i < v.size(); i++)
for (int size = v.size()-1; size > 0; size--)
}//建立大根堆
void heapsort_::heapinsert(vector &v,int
index)
}void heapsort_::heapify(vector &v,int
size)
}void heapsort_::swap(vector &v, int a, int
b)int
main()
h.heapsort(v);
for (int i = 0; i < 15; i++)
return0;
}
排序之堆排序
堆排序是一種基於比較排序的另一種排序演算法,它採用了一種近似完全二叉樹的二叉堆資料結構。演算法實現相容了插入排序的空間原址性 即只需要有限個額外的儲存空間 和歸併排序的優良時間複雜度。偽 如下 heapsort a build max heap a for i a.length downto 2 e...
排序之堆排序
這裡沒有對0號元素進行排序 堆排 public class heap public static void exec comparable array,int i,int j 下沉 private static void sink comparable array,int k,int n publi...
排序之堆排序
堆其實是一種完全二叉樹,從上到下從左到右,大頂堆的父節點大於其左右子節點,小頂堆的父節點小於其左右子節點 1 首先是進行heapify,建立堆 2 從下到上,從右到左的進行heapify構建有序的堆 3 進行排序,將堆頂父節點和底層最右邊的子節點互換,然後不斷重複以上步驟 1 heapify def...