Ideas
Take ascending order as an example:
-
Return
Divide the array in half, and then recursively "divide" the sub-array until it is divided into individual numbers
-
and
Combine the two numbers into an ordered array , and then combine the ordered arrays until all sub-arrays are combined into a complete array
Operation of merging ordered arrays:
- Create an empty array
res
to store the final sorted array - Compare the heads of an ordered array, and the smaller one is dequeued and pushed
res
in - If the two arrays still have values, repeat the second step
The animation demonstration of ascending merge sort is shown in the figure:
Time complexity : O(nlogn)
achieve
Existing array 7, 5, 15, 4, 9, 3, 12, 6]
, sort in ascending order:
Array.prototype.mergeSort = function() {
const rec = arr => {
// 若数组长度为一,直接返回该数
if (arr.length === 1) return arr;
// slice():左闭右开,不会改变原数组
const mid = Math.floor(arr.length / 2);
// 左侧数组
const left = arr.slice(0, mid);
// 右侧数组
const right = arr.slice(mid, arr.length);
// 左侧有序数组
const orderLeft = rec(left);
// 右侧有序数组
const orderRight = rec(right);
const res = [];
while (orderLeft.length || orderRight.length) {
// 若两个数组都有值,则头部较小者推入res中
if (orderLeft.length && orderRight.length) {
res.push(orderLeft[0] < orderRight[0] ? orderLeft.shift() : orderRight.shift());
} else if (orderLeft.length) {
// 右侧数组空,左侧数组头部推入res
res.push(orderLeft.shift());
} else if (orderRight.length) {
// 左侧数组空,右侧数组头部推入res
res.push(orderRight.shift());
}
}
return res;
};
const res = rec(this);
// 将res拷贝到this
res.forEach((item, index) => {
this[index] = item;
});
};
const arr = [7, 5, 15, 4, 9, 3, 12, 6];
arr.mergeSort();
console.log(arr);
Results of the: