在java中尝试代码合并排序时发生堆栈溢出错误

66bbxpm5  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(382)

我是一个新的编码,我试图在java中创建合并排序算法。我得到太多的错误,我不能找出确切的错误代码。我觉得我的逻辑是正确的,但不知道哪一步是导致错误的。有人能帮我纠正下面代码中的错误吗。谢谢您

package com.company;
public class MergeSort_Array {
    //Method created to print Input Array
    public static void printInputArray(int inputArray[]) {
        for (int i:inputArray) { //for-each loop
            System.out.print(i + " ");
        }
        System.out.println();
    }

    //Function created to sort and merge Input Array:
    public static void SortArray(int[] A) {
        int midpoint = A.length / 2;
        int[] left = new int[midpoint];
        int[] right;
        if (A.length % 2 == 0) {
            right = new int[midpoint];
        } else {
            right = new int[midpoint + 1];
        }
        //Copying values from super Array to left Array:
        for (int i = 0; i < midpoint; i++) {
            left[i] = A[i];
        }
        //Copying elements from super Array to right Array:
        for (int j = 0; j < right.length; j++) {
            right[j] = A[midpoint + j];
        }
        //using Recursion
        SortArray(left);
        SortArray(right);
        MergeArray(A, left, right);
    }

    // Creating a Function to merge left and right arrays.
    public static void MergeArray(int[] result, int[] L, int[] R) {
        //result array length = length of left array+ right array length
        result = new int[L.length + R.length];
        int i = 0, j = 0, k = 0;
        while (k < result.length) {
            if (L[i] < R[j]) {
                result[k] = L[i];
                i++;
            } else
            if (R[j] < L[i]) {
                result[k] = R[j];
                j++;
            } else
            if (i > L.length) {
                while (j <= R.length) {
                    result[k] = R[j];
                    j++;
                }
            } else
            if (j > R.length && i <= L.length) {
                while (i <= L.length) {
                    result[k] = L[i];
                    i++;
                }
            }
            k++;
        }
    }

    public static void main(String[] args) {
        int[] inputArray = { 2, 5, 4, 1, 7, 9, 6 };
        MergeSort_Array ms = new MergeSort_Array();
        ms.printInputArray(inputArray);
        SortArray(inputArray);

        for (int i: inputArray) {
            System.out.println(i + " ");
        }
    }
}
jqjz2hbq

jqjz2hbq1#

每次你打电话 SortArray 它将自己召唤 SortArray 两次。没有终止条件:每次调用都将尝试调用 SortArray 两次。
这意味着 SortArray 可以完成,因为你在它们中无限地递归。
一定有一些基本情况下,它不再称自己。对于mergesort,一旦数组足够小,通常会切换到其他算法,但为了简单起见,您甚至可以退回到最简单的基本情况进行排序:任何小于2个元素的数组都会被排序,并且不需要做任何其他事情来排序。

sg3maiej

sg3maiej2#

代码中存在多个问题:
[专业] SortArray() 总是尝试拆分数组并对两半进行排序。如果数组长度小于2,则不应执行此操作,否则会出现无限递归,从而导致堆栈溢出异常。
[提示] right 可以无条件初始化为 int[] right = new int[A.length - midpoint]; [专业] MergeArray 不应重新分配目标阵列。合并必须就地执行到 result 所以调用者的对象被更新。
[major]在合并循环中,您必须在尝试读取之前测试索引值 L[i] 或者 R[j] ,否则可能会出现越界异常。
以下是一个修改版本:

package com.company;
public class MergeSort_Array {
    // Method created to print Input Array
    public static void printInputArray(int inputArray[]) {
        for (int i : inputArray) { //for-each loop
            System.out.print(i + " ");
        }
        System.out.println();
    }

    //Function created to sort and merge Input Array:
    public static void SortArray(int[] A) {
        if (A.length >= 2) {
            int midpoint = A.length / 2;
            int[] left = new int[midpoint];
            int[] right = new int[A.length - midpoint];

            //Copying values from super Array to left Array:
            for (int i = 0; i < midpoint; i++) {
                left[i] = A[i];
            }
            //Copying elements from super Array to right Array:
            for (int j = 0; j < right.length; j++) {
                right[j] = A[midpoint + j];
            }
            //using Recursion
            SortArray(left);
            SortArray(right);
            MergeArray(A, left, right);
        }
    }

    // Creating a Function to merge left and right arrays.
    public static void MergeArray(int[] result, int[] L, int[] R) {
        for (int i = 0, j = 0, k = 0; k < result.length; k++) {
            if (j >= R.length || (i < L.length && L[i] < R[j])) {
                result[k] = L[i++];
            } else {
                result[k] = R[j++];
            }
        }
    }

    public static void main(String[] args) {
        int[] inputArray = { 2, 5, 4, 1, 7, 9, 6 };
        printInputArray(inputArray);
        SortArray(inputArray);
        printInputArray(inputArray);
    }
}

相关问题