演算法設計與分析筆記——合併排序
阿新 • • 發佈:2019-01-06
簡介
合併排序演算法是用分治策略實現對n個元素進行排序的演算法。其 基本思想 是:將待排序元素分成大小大致相容的2個子集合,分別等於2個子集合進行排序,最終將排好序的子集合合併成為所要求的排好序的集合。
·
圖解:
非遞迴合併排序演算法
public static void mergeSort(Comparable a[], int left, int right){
Comparable []b = new Comparable[a.length];
int s = 1;
while(s < a.length){
mergePass(a, b, s); // 合併到陣列b
s += s;
mergePass(b, a, s); // 合併到陣列a
s += s;
}
}
合併排序遞迴演算法
public static void mergeSort(Comparable a[], int left, int right){
if(left < right){//至少有兩個元素
int i = (left + right) / 2; // 取中點
mergeSort(a, left, i);
mergeSort(a, i + 1, right);
merge(a, b, left, i, right); // 合併到陣列b
copy(a, b, left, right); // 複製回陣列a
}
輔助演算法
> `public static void mergePass(Comparable []x , Comparable []y , int s){
// 合併大小為s的相鄰子陣列
int i = 0;
while(i <= x.length - 2 * s){
merge(x, y, i, i+s-1, i+2*s-1);
i = i + 2 * s;
}
// 剩下的元素個數少於2s
if(i + s < x.length)
merge(x, y, i+s-1, x.length - 1);
else
for(int j = i; j < x.length; j++)
y[j] = x[j];
}`
> `public static void merge(Comparable []c , Comparable []d , int l, int m, int r){
// 合併c[1:m]和c[m+1:r]到d[1:r]
int i = 1, j = m+1, k = 1;
while((i <= m) && (j <= r))
if(c[i].compareTo(c[j]) <= 0)
d[k++] = c[i++];
else d[k++] = c[j++];
if(i > m)
for(int q = j; q <= r; q++)
d[k++] = c[q];
else
for(int q = i; q <= m; q++)
d[k++] = c[q];
}