归并的思想就是将本是无序的数组序列 {16,7,13,10,9,15,3,2,5,8,12,1,11,4,6,14} 通过两两合并排序后再合并,最终获得一个有序的数组。如下图。
基本思想
二路归并排序:
假设初始序列含有
n
个记录,则可以看成是
图解
下图是二路归并排序算法过程的一个实例:
一次二路归并排序算法的目标是把若干个长度为
考虑到:
若元素个数为
2k
的整数倍,则两两归并正好完成
n
个数据元素的一次二路归并;
若元素个数不为
- ①若剩余的元素个数大于
k
而小于
2k ,则把前 k 个元素作为一个子数组,把剩余的元素作为最后一个子数组。 ②若剩余的元素个数小于
k 时,即剩余的元素个数只够一组时,则不用再进行两两归并排序。算法实现
1、一次二路归并排序算法如下:
/**
* 一次二路归并排序算法
* @param a 要排序的序列
* @param s 起始坐标
* @param m 中间坐标
* @param e 结束坐标
*/
function Merge(a, s, m, e)
{
var n1 = m - s + 1; /*前半段长度*/
var n2 = e - m; /*后半段长度*/
var L = [];
var R = [];
var i, j, k;
for (i = 0; i < n1; i++){
L[i] = a[s + i];
}
for (j = 0; j < n2; j++){
R[j] = a[m + j + 1];
}
L[n1] = 10000000;
R[n2] = 10000000;
/* 将 前段数据与后段数据 比较由小到大归并入 L 中 */
for (i = 0, j = 0, k = s; k <= e; k++)
{
if (L[i] <= R[j])
{
a[k] = L[i];
i++;
}
else{
a[k] = R[j];
j++;
}
}
}
2、归并排序算法
/**
* 归并排序算法
* @param a 要排序的序列
* @param s 起始坐标
* @param e 结束坐标
*/
function MergeSort(a, s, e) {
if (s < e) {
var m = parseInt((s + e) / 2);
MergeSort(a, s, m);
MergeSort(a, m + 1, e);
Merge(a, s, m, e);
}
}