以下实施合并排序算法有什么问题。它只返回未定义。
我怀疑错误是合并功能的某个地方。
有人可以帮我指出错误。
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;
}
合并功能
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
这是控制台上的输出
inotifywait
答案 0 :(得分:0)
在排序中放置可能的“off-by-1”错误,merge()
函数在将合并列表复制回源数组的方式上存在问题。该函数被告知从lower
合并到higher
。但是,合并后的数组将被复制回原始数组从索引0开始。相反,您需要确保仅在lower
和higher
之间修改原始数组:
for (var a = 0; a <= k; a++) {
console.log(a);
arr1[a + lower] = mergearr[a]; // <--- here
console.log(arr1[a + lower]);
}
答案 1 :(得分:0)
我可以调整你的代码。是的,问题在于您的merge()
功能。看看:
merge()
返回任何内容
没有在任何地方使用过。 a
应该从lower
开始,每次都会增加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];
}
}
为了避免重写已排序的数组部分
driver.execute_script('''
var element = document.getElementsByClassName("quoteBox"), index;
for (index = element.length - 1; index >= 0; index--) {
element[index].parentNode.removeChild(element[index]);
}
''')
&#13;