歸併排序(Merge sort)是建立在歸併操作上的一種有效的排序演算法。此演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
歸併(Merge)排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分成若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。
歸併排序是建立在歸併操作上的一種有效的排序演算法。此演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為2-路歸併。
歸併操作的過程如下:
1.申請空間,使其大小為兩個已經排序序列總和,該空間用來存放合併後的序列
2.設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
3.比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置
4.重複步驟3直到某一指針達到序列尾
5.將另一個序列剩下的所有元素直接複製到合併序列尾
範例1:
/**
* 合併運算(merge),也叫合併演算法,指的是將兩個已經排序的序列合併成一個序列的運算。
* 合併排序演算法依賴合併運算。
*
* 合併作業的過程如下:
*
* 1、申請空間,使其大小為兩個已排序序列之和,該空間用來存放合併後的序列
* 2、設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
* 3、比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一個位置
* 4、重複步驟3直到某一指標達到序列尾
* 5、將另一序列剩下的所有元素直接複製到合併序列尾
*
*/
/***/
🎜>function mergeSort(items) {
if (items.length return items;
,
left = items.slice(0, middle),
right = items.slice(middle),
right = items.slice(middle),
>
params.unshift(0, items.length);
items.splice.apply(items, params);
return itemsms
> var result = [],
il = 0,
left.length && ir if (left[il ] result.push(left[il ]);
result.push(right[ir ]);
}
}
return result.concat(left.slice(il)) .concat(right.slice(ir));
}
}
// test }
}
// test }
}
// test arr 1, 3, 12, 5, 66, 23, 87, 15, 32];
mergeSort(arr);
範例2:
程式碼如下: