Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个特殊的合并排序程序是如何工作的?_Java_Algorithm_Sorting_Data Structures_Mergesort - Fatal编程技术网

Java 这个特殊的合并排序程序是如何工作的?

Java 这个特殊的合并排序程序是如何工作的?,java,algorithm,sorting,data-structures,mergesort,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[

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

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++;
    }
}
公共类合并排序{
私有int[]编号;
私人助理;
私有整数;
公共void排序(int[]值){
这个数字=数值;
数字=值。长度;
this.helper=newint[number];
合并排序(0,数字-1);
}
私有void合并排序(整数低,整数高){
如果(低<高){
int middle=低+(高-低)/2;
合并排序(低、中);
合并排序(中+1,高);
合并(低、中、高);
}
}
私有无效合并(整数低、整数中、整数高){

对于(inti=low;i而言,线索实际上在参考文章中:

            // Copy the rest of the left side of the array into the target array
            while (i <= middle) {
                    numbers[k] = helper[i];
                    k++;
                    i++;
            }
//将数组左侧的其余部分复制到目标数组中

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

            // Copy the rest of the left side of the array into the target array
            while (i <= middle) {
                    numbers[k] = helper[i];
                    k++;
                    i++;
            }
//将数组左侧的其余部分复制到目标数组中

while(我做得好吗?你试过桌面检查或调试吗?是的,它正在工作并产生预期的输出。它做得好吗?你试过桌面检查或调试吗?是的,它正在工作并产生预期的输出。是的,更好的问题是为什么我们不需要复制下半年的数字。我已经得到了我的答案。非常感谢:)@S.kalya-不需要后半部分的数字,因为在合并之前已经完成了对临时数组的复制,并且合并正在从临时数组合并回原始数组。如果合并排序更有效,并且根据递归级别在原始和临时缓冲区之间交替合并方向,那么就不会有副本ep,合并将需要从上半部分或下半部分复制任何剩余的数字。在运行大小=1并从原始合并到临时的特定情况下,它将需要复制1个元素。是的,更好的问题是为什么我们不需要复制下半部分的数字。我已经得到了我的答案。非常感谢:)@S.kalya-不需要后半部分的数字,因为在合并之前已经完成了对临时数组的复制,并且合并正在从临时数组合并回原始数组。如果合并排序更有效,并且根据递归级别在原始和临时缓冲区之间交替合并方向,那么就不会有副本ep,合并将需要从上半部分或下半部分复制任何剩余的数字。在运行大小==1的特定情况下,并从原始值合并到临时值,它将需要复制1个元素。