堆排序 合併排序 快速排序 簡單比較

2021-05-24 14:31:19 字數 1298 閱讀 7573

堆排序

1.      堆排序是構造一顆完全二叉樹

2.      堆有最大堆與最小堆兩種

3.      保持堆性質操作

當i的left(i) 和right(i)都是最大堆,這時i可能小於其子女,呼叫保持堆性質操作,讓a[i]下降使得以i為根的子樹保持最大堆

4.      建堆操作

乙個陣列作為輸入,先構建乙個完全二叉樹。這棵樹一般不會滿足最大堆性質。從i/2的節點位置開始,向前(i/2, i/2-1, i/2-2……)呼叫保持最大堆性質操作。最後將得到乙個最大堆。

5.      堆排序操作

最大堆構建完成後。因為陣列中最大元素在根a[1],則通過把它與a[n]互換來達到。現在,從堆中「去掉」節點n(輸出n節點的值),然後對a[1…n-1]構建最大堆。因為原來根的子女仍是最大堆,所以可能新的根元素違反了最大堆性質,則只用對新的根元素呼叫一次保持堆性質操作,就能得到新的最大堆。

然後再次重複剛才的操作,即可實現堆排序。

合併排序

合併排序由merge-sort和merge兩個子程式組成。

merge-sort(a,p,r)

if p < r

the q <- [ (p+r)/2 ]取下整數

merge-sort(a, p, q)

merge-sort(a,q+1,r)

merge(a,p,q,r)

合併排序由底向上進行排序。merge函式需要開闢新的儲存空間來儲存兩個待合併的有序陣列。

合併排序是由底向上是因為其先遞迴呼叫merge-sort,然後在不可在分解的時候(或則人為不讓再分解時)呼叫merge子程式。

合併排序可以將merge子程式替換掉,在將待排序空間劃分到乙個較小規模時,可以利用插入排序等其他排序方法。

快速排序

快速排序也由兩個部分組成,quicksort和partition。

quicksort(a,p,r)

if p

then q <- partition(a,p,r)

quicksort(a,p,q-1)

quicksort(a,q+1,r)

快速排序的關鍵是partition,它將陣列進行就地重新排列,以乙個數為劃分,左邊的陣列儲存比它小的數,右邊的陣列儲存比它大的數。然後遞迴對左右陣列再次呼叫quicksort。

快速排序是由上之下的排序演算法,先進行頂層的排序,然後再遞迴呼叫左右部分進行排序。

快速排序的partition子程式不可替換成其它子程式,因為它必須實現將陣列劃分為左右兩個部分的邏輯。

經典排序 快速排序 合併排序 堆排序

一 快速排序 思想 用樞紐元素pivot將待排陣列分成兩個子表,左表中元素全都小於右表元素,遞迴執行 int partition int a,int low,int high for int i low,j mid 1,k i i mid j high k else while j high a k...

插入排序 合併排序 堆排序和快速排序

插入排序 時間複雜度o n2 param array原地排序演算法 public void insertsort int array array position present 合併排序 o nlogn param array param left 第乙個索引 param right 最後乙個索引...

插入排序 合併排序 堆排序和快速排序

1 插入排序 2 時間複雜度o n2 3 param array原地排序演算法 4 5public void insertsort int array 13 array position present 14 15 1617 1819 20 21 合併排序 22 o nlogn 23 param a...