以下为错误代码:
其实整体逻辑结构是正确的,只是有个地方有个小细节没注意,导致整个算法都错了
var arr = [8, 2, 9]
function mergeSort(arr, L, R) {
if (L == R) {
return
}
mid = L + ((R - L) >> 1)
mergeSort(arr, L, mid)
mergeSort(arr, mid + 1, R)
merge(arr, L, R, mid)
}
function merge(arr, L, R, M) {
var help = []
p1 = L
p2 = M + 1
while (p1 <= M && p2 <= R) {
if (arr[p1] >= arr[p2]) {
help.push(arr[p1])
p1++
} else {
help.push(arr[p2])
p2++
}
}
while (p1 <= M) {
help.push(arr[p1])
p1++
}
while (p2 <= R) {
help.push(arr[p2])
p2++
}
for (var i = 0; i < help.length; i++) {
arr[i + L] = help[i]
}
}
mergeSort(arr, 0, arr.length - 1)
console.log(arr);
测试用例用到的数组为[8,2,9],降序排序结果为[8,9,2]
按照归并算法的逻辑,应该是下图这样:
但是调试过程却出现了对p(1,2)这样的组合,经排查是变量mid的锅,由于定义时没加var,而是给它直接赋值,使它变成了全局变量,内部值无法及时清零,从而导致了程序错误。