【问题标题】:What are this java while loops doing in merge sort?这个 java while 循环在合并排序中做了什么?
【发布时间】:2020-02-28 17:27:40
【问题描述】:

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

    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 合并到 arr 中。第 2 步和第 3 步是把剩余的数字相加,只有 2 中的一个会被执行,这是在到达 L 或 R 的末尾之后,以填充另一个数组的剩余值。

标签: java arrays algorithm loops divide-and-conquer


【解决方案1】:

您可以选择跳过这些步骤而只使用 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 &gt;= 0len--

【讨论】:

    【解决方案2】:

    “第一步”完成从两个源数组合并到目标的工作。当LR 用尽时,其他源数组中可能仍有未合并的元素。 “第二步”用于将任何剩余元素从 L 复制到目标。 “第三步”与R 的目的相同。

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 2011-07-18
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多