【问题标题】:How this particular merge sort program is working?这个特定的合并排序程序是如何工作的?
【发布时间】:2016-12-05 11:05:33
【问题描述】:

我正在学习排序算法。我已经完成了以下链接中给出的程序。为了简单起见,我附上了链接和程序本身。

public class Mergesort {
private int[] numbers;
private int[] helper;
private int number;

public void sort(int[] values) {
    this.numbers = values;
    number = values.length;
    this.helper = new int[number];
    mergesort(0, number - 1);
}

private void mergesort(int low, int high) {
    if (low < high) {
    int middle = low + (high - low) / 2;
    mergesort(low, middle);
    mergesort(middle + 1, high);
    merge(low, middle, high);
    }
}

private void merge(int low, int middle, int high) {
    for (int i = low; i <= high; i++) {
        helper[i] = numbers[i];
    }
    int i = low;
    int j = middle + 1;
    int k = low;
    while (i <= middle && j <= high) {
        if (helper[i] <= helper[j]) {
            numbers[k] = helper[i];
            i++;
        } else {
            numbers[k] = helper[j];
            j++;
        }
        k++;
    }
    while (i <= middle) {
        numbers[k] = helper[i];
        k++;
        i++;
    }
}

}

我不知道在合并方法中为什么包含最后一个 while(ihttp://www.vogella.com/tutorials/JavaAlgorithmsMergesort/article.html

对不起,我的解释不好。希望有人能给我解释一下。

【问题讨论】:

  • 有效吗?您是否尝试过桌面检查或调试?
  • 是的,它正在工作并产生预期的输出。

标签: java algorithm sorting data-structures mergesort


【解决方案1】:

线索其实在参考文章中:

            // Copy the rest of the left side of the array into the target array
            while (i <= middle) {
                    numbers[k] = helper[i];
                    k++;
                    i++;
            }

考虑前半部分的数字都大于后半部分的数字的情况。然后在第一个while 循环中你只会增加j,你不会从前半部分复制任何数字。第二个while 循环复制前半部分的剩余数字。

一个很好的问题是为什么您实际上不需要从下半场复制剩余的数字。我会把它留给你。 :)

【讨论】:

  • 是的,更好的问题是为什么我们不需要复制下半年的数字。我得到了我的答案。非常感谢:)
  • @S.kalya - 不需要后半部分的数字,因为在合并之前已复制到临时数组,并且合并正在从临时数组合并回原始数组.如果合并排序更有效,并且基于递归级别在原始缓冲区和临时缓冲区之间交替合并方向,那么将没有复制步骤,并且合并需要从前半部分或后半部分复制任何剩余的数字。在运行大小 == 1 并从原始合并到临时的特定情况下,它需要复制 1 个元素。
猜你喜欢
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多