3 自底向上的歸併排序
less和exch可以檢視上一章:
演算法分析(3)-簡單排序總結(選擇,插入,希爾含**)——comparable介面
歸併採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序是一種穩定的排序方法。
自頂向下其實是先完成左側陣列然後完成右側陣列的排序規則:
實現歸併的一種方式就是直接將兩個有序陣列歸併到第三個陣列中,圖示如下:
首先將左右序列排序好的陣列a[k
]a[k]
a[k]
所有元素複製到aux
[k]aux[k]
aux[k]
中:
2. 然後將aux
[k]aux[k]
aux[k]
中的元素歸併到a[k
]a[k]
a[k]
中。
原地歸併演算法如下:
這裡的les
sless
less
可以檢視上一章演算法分析(3)-簡單排序總結(選擇,插入,希爾含**)
//lo第乙個元素,hi最後乙個元素
private
static
void
merge
(comparable[
] a, comparable[
] aux,
int lo,
int mid,
int hi)
}
使用以上的抽象方法可以使用遞迴的方式完成遞迴排序。
首先上**:
//遞迴的實現歸併排序
public
class
merge
//排序
private
static
void
sort
(comparable[
] a,
int lo,
int hi)
}
其實sor
tsort
sort
的的作用只是對mer
gemerge
merg
e執行的順序完成合理呼叫。
這裡直接給出對於長度為n
nn的陣列,自頂向下的歸併排序的比較次數:1/2
nlgn
1/2nlgn
1/2nlg
n~nlgn
nlgn
nlgn
訪問陣列的次數(最多):6nl
gn6nlgn
6nlg
n關於演算法規模的計算以及數學分析的相關證明,會在本專欄之後進行更新。
**後期會在github上更新,目前博主的git在商用,暫時不放優化**
對小規模子陣列使用插入排序
對子陣列隨時檢測是否有序
不講元素複製到輔助陣列
自底向上其實就是從所有陣列中最小分組進行歸併排序
首先進行分解(這裡的分解其實使用遞迴即可):
當分解到最簡元素時進行原地歸併:
//遞迴的實現歸併排序
public
class
merge
}
這裡直接給出對於長度為n
nn的陣列,自頂向下的歸併排序的比較次數:1/2
nlgn
1/2nlgn
1/2nlg
n~nlgn
nlgn
nlgn
訪問陣列的次數(最多):6nl
gn6nlgn
6nlg
n
演算法 1 排序 歸併排序
歸併排序思想 1.把長度為n的輸入序列分成兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個排序好的子串行合併成乙個最終的排序序列。小結 平均時間複雜度o nlogn 最好情況o nlogn 最壞情況o nlogn 空間複雜度o n 占用額外記憶體 穩定性 穩定 歸併排序入口 ...
3 排序演算法 歸併排序
問題描述 歸併排序演算法對下列例項排序,寫出基於歸併排序演算法對下面例項進行排序的具體過程。a 48,12,61,3,5,19,32,7 解題思想 將n個元素分成2個子集合,分別對子集合進行排序,最終將排好序的子集合合併為有序集合。n 1是中止。如下 include include using na...
alg4 排序 歸併排序
歸併操作 即將兩個有序的陣列歸併成乙個更大的有序陣列。歸併排序示意圖 歸併排序最吸引人的性質是它能夠保證將任意長度為n的陣列排序所需時間和nlogn成正比 它的最主要缺點則是它所需的額外空間和n成正比。原地歸併的抽象方法 它將涉及的所有元素複製到乙個輔助陣列中,再把歸併的結果放回原陣列中。merge...