归并算法的解决思路
归并算法主要利用的是分治的思想去解决一个问题。分治的思想通俗的说就是将一个大问题拆解成若干个小问题,通过解决小问题并且集合解决结果从而达到解决大问题的目的。
归并排序就是利用这个思想,然而在这个算法中,有一个条件;就是若干个拆分出来的小问题的解决思路与大问题的解决思路基本一致。
分而治之的过程
代码实现
function merge(arr, start, end) {
if (start >= end) {
return;
}
let mid = Math.floor(start + (end - start) / 2);
merge(arr, start, mid);
merge(arr, mid + 1, end);
let temp = [];
let leftPoint = start;
let rightPoint = mid + 1;
while (leftPoint <= mid && rightPoint <= end) {
if (arr[leftPoint] <= arr[rightPoint] ) {
temp.push(arr[leftPoint++]);
} else {
temp.push(arr[rightPoint++]);
}
}
for (; leftPoint <= mid; leftPoint++){
temp.push(arr[leftPoint]);
}
for (; rightPoint <= end; rightPoint++){
temp.push(arr[rightPoint]);
}
for (let i = 0; i < temp.length; i++) {
arr[start + i] = temp[i];
}
}
时间复杂度
查看上面代码,使用的是递归。使用master公式计算时间复杂度为:
稳定性
稳定
只要在合并的过程中保证,当 arr[leftPoint] === arr[rightPoint] 时,将左边的数存入临时数组即可保证算法稳定性。