美文网首页
Merge sort

Merge sort

作者: 超薄智能 | 来源:发表于2018-08-07 17:44 被阅读9次
  • divide and conquer
  • recursion

var arr = [3, 2, 4, 1, 6, 0, 9, -10];
mergeSortAlg(arr);

function mergeSortAlg(arr) {
    var n = arr.length;

    // base condition
    // check the input
    if (n <= 1) return arr;

    var mid = Math.floor((n - 1) / 2);

    // get left ref
    // keep the same ref
    var leftArr = [];
    for (var i = 0; i <= mid; i++) {
        leftArr[i] = arr[i];
    }

    // ger right ref
    var rightArr = [];
    for (var i = mid + 1, j = 0; i < n; i++ , j++) {
        rightArr[j] = arr[i];
    }

    // recursion, calling itself
    mergeSortAlg(leftArr); 
    mergeSortAlg(rightArr);
    return merge(leftArr, rightArr, arr);
}

// Merge to sorted array
// Q: could be improved by binary search ?
function merge(left, right, arr) {
    var k = 0;
    var i = 0;
    var j = 0;

    var na = left.length;
    var nb = right.length;

    while (i < na && j < nb) {
        if (left[i] < right[j]) {
            arr[k] = left[i];
            i++;
            k++;
        } else if (left[i] > right[j]) {
            arr[k] = right[j];
            j++;
            k++;
        } else {
            arr[k] = left[i];
            k++;
            i++;

            arr[k] = right[j];
            k++;
            j++;
        }
    }

    // a still have 
    while (i < na) {
        arr[k] = left[i];
        k++;
        i++;
    }

    // b still have
    while (j < nb) {
        arr[k] = right[j];
        k++;
        j++;
    }

    return arr;
}

相关文章

网友评论

      本文标题:Merge sort

      本文链接:https://www.haomeiwen.com/subject/blbavftx.html