有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何合并排序?只是想知道我哪里错了

我开始用java编程,并尝试学习合并排序。我得到了算法并用它编码。我不明白我错了什么地方。有人能帮我理解合并排序和调试这段代码吗

public class Main {

     public static void main(String[] args) {

     // Merge Sort

    int[] myArray = {2, 4, 1, 6, 8, 5, 3, 7};


        mergeSort(myArray);
        System.out.println((Arrays.toString(myArray)));
    }
    public static void mergeSort(int []toSortArray){
       int n= toSortArray.length;
       if (n < 2) {
        return;
       }
    int mid = n/2;
    int [] Left= new int [mid];
    int []Right = new int[n-mid];
    for(int i=0;i<mid-1;i++){
        Left[i]=toSortArray[i];
    }
    for(int i=mid;i<n-1;i++){
        Right[i-mid]=toSortArray[i];
    }
    mergeSort(Left);
    mergeSort(Right);
    merge(Left,Right,toSortArray);

}

public static void merge(int[] Left, int [] Right, int []SortedArray){
    int nL = Left.length;
    int nR= Right.length;

    int i=0;//Index position for left array
    int j=0;// index of position of Right array
    int k=0;// Index position of sorted Array

    while (i<nL && j<nR){
        if (Left[i]<Right[j]) {
            SortedArray[k] = Left[i];
            i++;
            k++;
        }
        if (Right[j]<Left[i]){
            SortedArray[k] = Right[j];
            j++;
            k++;
        }
    }
    while(i<nL){
        SortedArray[k]=Left[i];
        i++;
        k++;
    } while (j<nR){
        SortedArray[k]= Right[j];
        j++;
        k++;
    }

}

}

共 (1) 个答案

  1. # 1 楼答案

    在mergeSort()中,复制数据的两个循环应该是i<;mid(不是i<;mid-1)和i<;n(不是i<;n-1)

    在merge()中,第一个if应该是if(Left[i]<;=Right[j])(而不仅仅是<;)。第二个if(Right[j]<;Left[i])可以由一个else替换(不需要第二个if)

    以下代码似乎正在工作:

    package x;
    import java.util.Arrays;
    public class x {
        public static void main(String[] args) {
            int[] myArray = {2, 4, 1, 6, 8, 5, 3, 7};
        mergeSort(myArray);
        System.out.println((Arrays.toString(myArray)));
        }
    
        public static void mergeSort(int []toSortArray){
            int n= toSortArray.length;
            if (n < 2) {
                return;
            }
            int mid = n/2;
            int []Left = new int [mid];
            int []Right = new int[n-mid];
            for(int i=0;i<mid;i++){
                Left[i]=toSortArray[i];
            }
            for(int i=mid;i<n;i++){
                Right[i-mid]=toSortArray[i];
            }
            mergeSort(Left);
            mergeSort(Right);
            merge(Left,Right,toSortArray);
        }
    
        public static void merge(int[] Left, int [] Right, int []SortedArray){
            int nL = Left.length;
            int nR= Right.length;
    
            int i=0;// index position for Left array
            int j=0;// index position for Right array
            int k=0;// index position for Sorted array
    
            while (i<nL && j<nR){
                if (Left[i]<=Right[j]) {
                    SortedArray[k] = Left[i];
                    i++;
                    k++;
                } else {
                    SortedArray[k] = Right[j];
                    j++;
                    k++;
                }
            }
            while(i<nL){
                SortedArray[k]=Left[i];
                i++;
                k++;
            } while (j<nR){
                SortedArray[k]= Right[j];
                j++;
                k++;
            }
        }
    }