简体   繁体   中英

Simple implementation of merge sort in javascript

What's wrong with following implementation of merge sort algorithm. it just returns undefined .

I suspect the error is somewhere in merge function.

can someone help me point out the error.

    function mergeSort(arr1, lower, higher) {

    if (lower < higher) {
        var mid = Math.floor((lower + higher) / 2);
        mergeSort(arr1, lower, mid);
        mergeSort(arr1, mid + 1, higher);
        merge(arr1, lower, mid, higher);
    }
}

And merge function

function merge(arr1, lower, mid, higher) {

    var i = lower;
    var j = mid + 1;
    var k = 0;
    var mergearr = [];

    while (i < j && j <= higher) {

        if (arr1[i] <= arr1[j]) {
            mergearr[k] = arr1[i];
            k++;
            i++;
        } else {
            mergearr[k] = arr1[j];
            k++;
            j++;
        }

    }

    if (i === j) {
        while (j < higher) {
            mergearr[k] = arr1[j];
            k++;
            j++;
        }
    } else if (j > higher) {
        while (i < j) {
            mergearr[k] = arr1[i];
            k++;
            i++;
        }
    }


    for (var a = 0; a <= k; a++) {
        console.log(a);
        arr1[a] = mergearr[a];
        console.log(arr1[a]);
    }

    return arr1;
}

Here is output on the console

index: 0
 value: 4
index: 1
 value: 5
index: 2
 value: 4
index: 3
 value: undefined
index: 0
 value: 4
index: 1
 value: 4
index: 2
 value: 5
index: 3
 value: 4
index: 4
 value: undefined
index: 0
 value: undefined
index: 1
 value: 4
index: 2
 value: undefined
index: 3
 value: undefined
index: 0

Setting aside possible "off-by-1" errors in the sort, the merge() function has a problem in the way that it copies the merged list back to the source array. The function is told to merge from lower to higher , which it does. But then, the merged array is copied back to the original array starting at index 0 . Instead, you need to make sure that the original array is only modified between lower and higher :

for (var a = 0; a <= k; a++) {
    console.log(a);
    arr1[a + lower] = mergearr[a]; // <--- here
    console.log(arr1[a + lower]);
}

I could tweak your code. Yes, the problem was with your merge() function. Take a look:

  • you don't need to return anything from merge() since this value isn't used anywhere.
  • a should start from lower which is incremented every time in order to avoid rewriting already sorted part of the array
  • your construction to pick up odd indexes` values was weird and bloating
  • also you messed up indexes at the beginning of the function

 var arr = [5,3,7,8,1,2,6,3,2]; mergeSort(arr, 0, arr.length - 1); console.log(arr); function mergeSort(arr, lower, higher) { if (lower < higher) { var mid = Math.floor((lower + higher) / 2); mergeSort(arr, lower, mid); mergeSort(arr, mid + 1, higher); merge(arr, lower, mid, higher); } } function merge(arr, lower, mid, higher) { var l = mid-lower+1, r = higher-mid, k = lower, mergearr = [], i = 0, j = 0; while (i < l && j < r) { if (arr[lower+i] <= arr[mid+j+1]) { mergearr[k] = arr[lower+i]; i++; } else { mergearr[k] = arr[mid+j+1]; j++; } k++; } while (j < r) { mergearr[k] = arr[mid+j+1]; k++; j++; } while (i < l) { mergearr[k] = arr[lower+i]; k++; i++; } //console.log(mergearr, k, lower); for (var a = lower; a < k; a++) { arr[a] = mergearr[a]; } } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM