第一步和第二步(第三步)似乎在不断重复着我。为什么要这样编程?
int i = 0, j = 0;
int k = l;
while (i < n1 && j < n2) { ----step one
if (L[i] <= R[j]){
arr[k] = L[i];
i++;
}
else{
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1){ ---step two
arr[k] = L[i];
i++;
k++;
}
while (j < n2){ ----step three
arr[k] = R[j];
j++;
k++;
}
}
“第一步”完成了将两个源阵列合并到目标中的工作。当L
或R
用尽时,另一个源数组中可能仍保留有未合并的元素。存在“第二步”以将所有剩余元素从L
复制到目标。对于R
,“第三步”具有相同的目的。
您可以选择跳过这些步骤,而仅使用for循环,如果这样可以通过以下方式更方便:
for(int i = 0; i < arr.size(); i++) {
if(r >= right.size() || (l < left.size() && left[l] < right[r])) {
arr[i] = left[l++];
} else {
arr[i] = right[r++];
}
}
arr.size() = n1 + n2 in your implementation
甚至是:
while(len--) {
if(r >= right.size() || (l < left.size() && left[l] < right[r])) {
arr[i] = left[l++];
} else {
arr[i] = right[r++];
}
}
where len = n1 + n2
我个人认为这种方式更具可读性和易用性,但各有千秋! (这是不稳定的,可以使其变得稳定,但是我将这一部分留给读者弄清楚!)
编辑:我注意到它是Java,也许len--
无法工作,您可以在循环内执行len >= 0
和len--
。