思想:
總而言之,歸併排序總體分為兩步:分解與合併
先分解為許多有序的子區間,然後再將這些有序的子區間合併成乙個有序區間。見如下圖所示:
因此,我們在實現該演算法時就分為三步:
將區間劃分為兩部分將這兩部分分為有序的子區間將子區間合併成乙個有序區間
首先,我們先將整體思路來實現一下,具體如何分解如何合併我們後面一一分析:
**實現:
public
void
mergesortinternal
(int
array,
int low,
int high)
//分割為兩部分
int par=
(low+high)/2
;mergesortinternal
(array,low,par)
;mergesortinternal
(array,par+
1,high)
;//合併
merge
(array,low,par,high)
;}
上面**就是歸併排序的思路,也就是上面說的三步:分為兩個區間,分解,合併。
接下來就來看看如何將有序區間進行合併的:
merge方法:
先說一下合併方法的思想:
注意: 搬移元素的時候需要搬移回原位置,從 low 開始(low是原始陣列的下標)
我們以上圖中6 10和1 7兩個區間為例,假設s1代表第乙個區間的起始下標(也就是引數low),s2代表第二個區間的起始下標(也就是引數par+1);具體過程如下圖所示:
**實現:
private
void
merge
(int
array,
int low,
int par,
int high)
else
}//只有s1區間有元素
while
(s1<=par)
//只有s2區間有元素
while
(s2<=high)
//搬移元素
for(
int j=
0;j)}
八大排序 歸併排序
歸併排序 1.申請空間,使其大小為兩個已經排序的序列之和,用來存放合併後的序列。2.設定兩個指標指向兩序列的開始。3.比較兩個指標所指的元素,選擇小的放的合併空間,移動指標。4.重複3直到某個指標到達序列尾。5.將剩餘的元素拷到合併空間。實現 void merge sort int arr,int ...
八大排序 歸併排序
歸併排序 merge sort 也是一種常用的排序方法,歸併 的含義是將兩個或兩個以上的有序子串行合併成乙個新的有序子串行。如圖10 11為兩組有序子串行的歸併,有序子串行和,通過歸併把它們合併成乙個有序子串行。package ch02 import util.arrayutil public cl...
八大排序 歸併排序
歸併排序是一種很穩定,很快的排序,時間複雜度為o nlogn 作者很喜歡這個排序 大概思想就是分治,每次找一半,直到就剩一左一右兩個元素,比如說 遞迴找到最左面的也就是 發現有序,然後回溯找右面的發現右面不夠兩個,再回溯也就是合併,即和合併,取乙個temp陣列,用來儲存合併後有序的這個陣列,取左陣列...