java while 循环在合并排序中做什么?
What are this java while loops doing in merge sort?
第一步和第二步(第三步)好像反复运行我。为什么会这样编程?
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++;
}
}
"Step one" 完成从两个源数组合并到目标数组的工作。当 L
或 R
耗尽时,其他源数组中可能仍有未合并的元素。 "Step two" 存在以将任何剩余元素从 L
复制到目标。 "Step three" 与 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
我个人觉得这种方式更具可读性和更容易,但对每个人来说都是如此! (这是不稳定的,可以变得稳定,但我把那部分留给 reader 来解决!)
编辑:我注意到它是 java,也许 len--
不起作用,您可以在循环内执行 len >= 0
和 len--
。
第一步和第二步(第三步)好像反复运行我。为什么会这样编程?
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++;
}
}
"Step one" 完成从两个源数组合并到目标数组的工作。当 L
或 R
耗尽时,其他源数组中可能仍有未合并的元素。 "Step two" 存在以将任何剩余元素从 L
复制到目标。 "Step three" 与 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
我个人觉得这种方式更具可读性和更容易,但对每个人来说都是如此! (这是不稳定的,可以变得稳定,但我把那部分留给 reader 来解决!)
编辑:我注意到它是 java,也许 len--
不起作用,您可以在循环内执行 len >= 0
和 len--
。