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