排序合集

121 阅读1分钟

归并排序 自下而上

const mergeSort = arr => {
	const len = arr.length;
	if (len < 2) {
		return arr;
	}
	// length >> 1 和 Math.floor(len / 2) 
	let middle = Math.floor(len / 2),
		left = arr.slice(0, middle),
		right = arr.slice(middle); 
	return merge(mergeSort(left), mergeSort(right));
};

const merge = (left, right) => {
	const result = [];
	while (left.length && right.length) {
		// 注意: 判断的条件是小于或等于,如果只是小于,那么排序将不稳定.
		if (left[0] <= right[0]) {
			result.push(left.shift());
		} else {
			result.push(right.shift());
		}
	}
	while (left.length) result.push(left.shift());
	while (right.length) result.push(right.shift());
	return result;
};

归并排序的时间复杂度为O(nlogn),因为拆数组要logn步,时间复杂度为n,所以综合时间复杂度为nlog(n)。