MergeSort - 实施

时间:2017-06-26 12:54:17

标签: java sorting mergesort

在许多递归调用之后,low变为等于high并且递归中断。之后会发生什么?任何人都可以解释。合并程序对我很清楚:当mergesort(0,5)被调用时,它会再次调用自己:mergesort(0,2)然后mergesort(0,1)。最后mergesort(0,0)然后递归中断。

之后会发生什么?控件在代码中的位置在哪里?堆栈在哪里使用?请帮帮我。

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) {
    // check if low is smaller than high, if not then the array is sorted
    if (low < high) {
        // Get the index of the element which is in the middle
        int middle = low + (high - low) / 2;
        // Sort the left side of the array
        mergesort(low, middle);
        // Sort the right side of the array
        mergesort(middle + 1, high);
        // Combine them both
        merge(low, middle, high);
    }
}

private void merge(int low, int middle, int high) {

    // Copy both parts into the helper array
    for (int i = low; i <= high; i++) {
        helper[i] = numbers[i];
    }

    int i = low;
    int j = middle + 1;
    int k = low;
    // Copy the smallest values from either the left or the right side back
    // to the original array
    while (i <= middle && j <= high) {
        if (helper[i] <= helper[j]) {
            numbers[k] = helper[i];
            i++;
        } else {
            numbers[k] = helper[j];
            j++;
        }
        k++;
    }
    // Copy the rest of the left side of the array into the target array
    while (i <= middle) {
        numbers[k] = helper[i];
        k++;
        i++;
    }

}

 public static void main(String[] args){
     int arr[] = {78,9,45,7,2,90};
     new MergeSort().sort(arr);
        for(int i = 0; i < arr.length;i++){
            System.out.print(arr[i] + "\t");
        }
 }

}

3 个答案:

答案 0 :(得分:1)

您可以使用else语句并观察执行仍然在低&gt; =高之后完成。在这里,只是跳过这些调用。

        private void mergesort(int low, int high) { 
    // check if low is smaller than high, if not then the array is sorted
     if (low < high) { 
    // Get the index of the element which is in the middle 
int middle = low + (high - low) / 2; // Sort the left side of the array mergesort(low, middle); // Sort the right side of the array 
mergesort(middle + 1, high); // Combine them both 
merge(low, middle, high); }

    else 
    System.out.prinln("low is higher than high. Low is " +low+ "high is" +high);
     }

答案 1 :(得分:1)

对于自上而下的合并排序,在从数组的递归拆分生成两次大小为1的运行之前,不会发生合并。这将是mergesort()调用merge()的第一个实例。然后mergesort()的实例返回到mergesort()的先前实例,最终到达它对merge()的调用,依此类推。合并顺序是深度优先/左首先。

相比之下,自下而上的合并排序(大多数库使用自下而上合并排序的一些变体,如timsort),跳过递归并将n个元素的数组视为大小为1的n次运行,并立即开始合并运行。运行的索引是迭代生成的(通过循环)。

这是自上而下合并排序的操作顺序的示例,其首先是深度,左边是第一个。 垂直条表示当前数组的左半部分和右半部分之间的分割。

|4 2 8 6 0 5 1 7 3 9|
|4 2 8 6 0|5 1 7 3 9|
|4 2|8 6 0|
|4|2|
|2 4|
    |8|6 0|
      |6|0|
      |0 6|
    |0 6 8|
|0 2 4 6 8|
          |5 1|7 3 9|
          |5|1|
          |1 5|
              |7|3 9|
                |3|9|
                |3 9|
              |3 7 9|
          |1 3 5 7 9|
|0 1 2 3 4 5 6 7 8 9|

答案 2 :(得分:1)

执行的是每个堆栈方法调用都会执行。如果您以图形方式表示堆栈,则每个步骤都包含以下内容:

1.- bottom/top --> mergeSort(0, 5)

2.- top    --> mergeSort(0, 2)
    bottom --> mergeSort(0, 5)

3.- top    --> mergeSort(0, 1)
               mergeSort(0, 2)
    bottom --> mergeSort(0, 5)

4.- top    --> mergeSort(0, 0) --> breaks and go back
               mergeSort(0, 1)
               mergeSort(0, 2)
    bottom --> mergeSort(0, 5)

5.- top    --> mergeSort(0, 1) --> finish and continue with next line
               mergeSort(0, 2)
    bottom --> mergeSort(0, 5)

6.- top    --> mergeSort(2, 2) --> next line after mergeSort(0, 1)
               mergeSort(0, 2)
    bottom --> mergeSort(0, 5)

7.- etc.

以图形方式表示的第一步,您可以弄清楚其余部分。希望有所帮助