Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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 MergeSort在数组中放入零_Java_Sorting_Merge_Mergesort_Array Merge - Fatal编程技术网

Java MergeSort在数组中放入零

Java MergeSort在数组中放入零,java,sorting,merge,mergesort,array-merge,Java,Sorting,Merge,Mergesort,Array Merge,MergeSort.java: public class MergeSort { public static void run(int[] array, int size) { mergeSort(array, 0, size - 1); } private static void mergeSort(int[] array, int i, int f) { if (i >= f) { return

MergeSort.java:

public class MergeSort {

    public static void run(int[] array, int size) {
        mergeSort(array, 0, size - 1);
    }
    
    private static void mergeSort(int[] array, int i, int f) {
        if (i >= f) {
            return;
        }
        
        int m = (i + f) / 2;
        mergeSort(array, i, m);
        mergeSort(array, m + 1, f);
        merge(array, i, m, f);
    }
    
    private static void merge(int[] array, int i1, int f1, int f2) {
        int[] aux = new int[f2 - i1 + 1];
        
        int startSave = i1;
        int endSave = f2;
        
        int i2 = f1 + 1;
        int i = 0;
        
        while (i1 <= f1 && i2 <= f1) {
            if (array[i1] <= array[i2]) {
                aux[i] = array[i1];
                ++i;
                ++i1;
            } else {
                aux[i] = array[i2];
                ++i;
                ++i2;
            }
        }
        
        if (i1 < f1) {
            while (i1 <= f1) {
                aux[i] = array[i1];
                ++i;
                ++i1;
            }
        } else {
            while (i2 <= f2) {
                aux[i] = array[i2];
                ++i;
                ++i2;
            }
        }
        
        int k = 0;
        for (int j = startSave; j <= endSave; ++j) {
            array[j] = aux[k];
            ++k;
        }
    }
}


我不知道为什么这样不行。为什么它只打印一个元素,而所有其他元素都是零?而且第一个元素甚至不是最小值。。。所以代码中一定有什么地方出了问题。你能帮我吗?我不知道我做错了什么

您的代码几乎是正确的,除了一些错误:


合并中的第一个while循环应该是while i1您的代码几乎是正确的,除了一些错误:


merge中的第一个while循环应该是while i1除了Aziz的深刻回答之外,我想强调一下mergeSort中包含边界I和f的约定可能会造成的混乱。Passinf作为切片后第一个值的索引的上边界允许更简单的代码,无需+1/-1调整,并且使用更惯用的除了Aziz的深刻回答之外,我想强调一下在mergeSort中包含边界I和f的约定可能造成的混乱。Passinf作为切片后第一个值的索引的上边界允许更简单的代码,无需+1/-1调整,并且更惯用
import java.util.Random;

public class Main {
    public static void main(String args[]) {
        Main m = new Main();
        m.run();
    }
    
    private void run() {
        Random r = new Random();
        int size = 8;
        int[] array = new int[size];
        
        int el = 0;
        for (int i = 0; i < size; ++i) {
            el = r.nextInt(50);     // randomly fills the array
            array[i] = el;
            System.out.print(array[i] + " ");    // prints each element
        }
        System.out.println("");
        
        MergeSort.run(array, size);
        
        for (int i = 0; i < size; ++i) {
            System.out.print(array[i] + " ");    // print each element to know if array is sorted
        }
        System.out.println("");
    }
}
$ java Main 
30 38 14 29 42 44 43 34 
38 0 0 0 0 0 0 0 
17 29 4 17 13 21 47 19 
17 0 0 0 0 0 0 0
41 25 38 49 7 4 26 46 
25 0 0 0 0 0 0 0
public class MergeSort {

    public static void run(int[] array, int size) {
        mergeSort(array, 0, size);
    }
    
    private static void mergeSort(int[] array, int i, int f) {
        if (f - i < 2) {
            return;
        }
        
        int m = i + (f - i) / 2;  /* avoid potential overflow on `(i + f) / 2`
        mergeSort(array, i, m);
        mergeSort(array, m, f);
        merge(array, i, m, f);
    }
    
    private static void merge(int[] array, int i1, int f1, int f2) {
        int[] aux = new int[f2 - i1];
        
        int startSave = i1;
        int endSave = f2;
        
        int i2 = f1;
        int i = 0;
        
        while (i1 < f1 && i2 < f1) {
            if (array[i1] <= array[i2]) {
                aux[i++] = array[i1++];
            } else {
                aux[i++] = array[i2++];
            }
        }
        
        while (i1 < f1) {
            aux[i++] = array[i1++];
        }
        while (i2 < f2) {
            aux[i++] = array[i2++];
        }
        
        int j = startSave;
        for (int k = 0; k < i; k++) {
            array[j++] = aux[k];
        }
    }
}