为了账号安全,请及时绑定邮箱和手机立即绑定

这个java while循环在合并排序中做什么?

这个java while循环在合并排序中做什么?

Smart猫小萌 2024-01-28 16:35:42
第一步和第二步(第三步)对我来说似乎是反复运行。为什么要这样编程呢?    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++;     } }
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

“第一步”执行将两个源数组合并到目标数组的工作。当LR耗尽时,另一个源数组中可能仍然存在未合并的元素。“第二步”用于将任何剩余元素复制L到目标。“第三步”也有同样的目的R



查看完整回答
反对 回复 2024-01-28
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

您可以选择跳过这些步骤并仅使用 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--


查看完整回答
反对 回复 2024-01-28
  • 2 回答
  • 0 关注
  • 30 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信