这个特定的合并排序程序如何工作?

时间:2016-12-05 11:05:33

标签: java algorithm sorting data-structures mergesort

我正在学习排序算法。我已经通过以下链接给出了一个程序。为了简单起见,我附上链接和程序本身。

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

}

我没有得到任何线索,在合并方法中为什么这最后一次(i&lt; = middle)被包括在内。意味着(j <=高)也存在,但这种情况被忽略了。 我得到这个程序的链接是http://www.vogella.com/tutorials/JavaAlgorithmsMergesort/article.html

对不起我的错误解释。希望有人可以向我解释。

1 个答案:

答案 0 :(得分:2)

线索实际上在参考文章中:

            // 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周期复制了上半部分的剩余数字。

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