排序算法之归并排序

205 阅读1分钟

归并算法的解决思路

归并算法主要利用的是分治的思想去解决一个问题。分治的思想通俗的说就是将一个大问题拆解成若干个小问题,通过解决小问题并且集合解决结果从而达到解决大问题的目的。

归并排序就是利用这个思想,然而在这个算法中,有一个条件;就是若干个拆分出来的小问题的解决思路与大问题的解决思路基本一致。

分而治之的过程

无标题-2021-10-13-0831.png

代码实现

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公式计算时间复杂度为: nlognnlogn

稳定性

稳定

只要在合并的过程中保证,当 arr[leftPoint] === arr[rightPoint] 时,将左边的数存入临时数组即可保证算法稳定性。