JavaScript implements merge sort

Ideas

Take ascending order as an example:

  1. Return

    Divide the array in half, and then recursively "divide" the sub-array until it is divided into individual numbers

  2. 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:

  1. Create an empty array resto store the final sorted array
  2. Compare the heads of an ordered array, and the smaller one is dequeued and pushed resin
  3. 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:

Guess you like

Origin blog.csdn.net/Jack_lzx/article/details/114932367