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

第一步和第二步(第三步)对我来说似乎是反复运行。为什么要这样编程呢?


    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++; 

    } 

}


Smart猫小萌
浏览 93回答 2
2回答

紫衣仙女

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

一只甜甜圈

您可以选择跳过这些步骤并仅使用 for 循环(如果通过以下方式对您来说更容易):&nbsp; &nbsp; &nbsp; &nbsp; for(int i = 0; i < arr.size(); i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(r >= right.size() || (l < left.size() && left[l] < right[r])) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arr[i] = left[l++];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arr[i] = right[r++];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }arr.size() = n1 + n2 in your implementation甚至这个:while(len--) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(r >= right.size() || (l < left.size() && left[l] < right[r])) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arr[i] = left[l++];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arr[i] = right[r++];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }}where len = n1 + n2我个人认为这种方式更具可读性和更容易,但对每个人来说都是如此!(这是不稳定的,可以变得稳定,但我把这部分留给读者去弄清楚!)编辑:我注意到它是java,也许len--无法在循环内len >= 0工作。len--
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java