有 Java 编程相关的问题?

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

Java中快速排序实现中的OutOfMemoryError

我正在尝试实现一个快速排序算法,我已经阅读了如何使用伪代码,并且由于我正在学习Java(“因为几个月前我已经用C++完成了快速排序”),我想将其应用到这样的语言中,但是每当我试着运行它时,就会遇到堆栈溢出或堆空间问题,请检查我的代码好吗?:D

    public static int[] quicksort(int arreglo[]){
    int size=arreglo.length;
    int pivote=arreglo[size/2];
    int menor[] = new int[size+2]; //If I leave the +2 I get stack overflow
    int mayor[] = new int[size+2]; //If I delete them I get heap space problems
    int j=0,k=0;
    if(size>2){
        for(int i=0;i<size;i++){
            if(arreglo[i]<=pivote){
                menor[j]=arreglo[i];
                j++;
            }
            else{
                mayor[k]=arreglo[i];
                k++;
            }
        }
        if(menor.length>=1&&mayor.length>=1)
            return concatena(Ordena.quicksort(menor),Ordena.quicksort(mayor),j,k);
        else
            if(menor.length>mayor.length)
                return menor;
            else
                return mayor;
    }
    else
        return arreglo;
}

public static int[] concatena(int menor[],int mayor[],int limite1,int limite2){
    int completo[] = new int[limite1+limite2];
    System.arraycopy(menor,0,completo,0,limite1);
    System.arraycopy(mayor,0,completo,limite1,limite2);
    return completo;
}

感谢您的评论和回答,我已做出了建议的更改,我将粘贴确切的例外情况:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at Ordena.quicksort(Ordena.java:6) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21) at Ordena.quicksort(Ordena.java:21)

下面是修改后的代码(我已经翻译了变量,很抱歉我没有注意到):

    public static int[] quicksort(int array[]){
    int size=array.length;
    int pivot=array[size/2];
    int less[] = new int[size+2];
    int greater[] = new int[size+2];
    int j=0,k=0;
    if(size>2){
        for(int i=0;i<size;i++){
            if(array[i]<=pivot){
                less[j]=array[i];
                j++;
            }
            else{
                greater[k]=array[i];
                k++;
            }
        }
        less[j]=pivot;
        if(j>=1&&j>=1)
            return concatenate(Ordena.quicksort(less),Ordena.quicksort(greater),j,k);
        else
            if(j>k)
                return less;
            else
                return greater;
    }
    else
        return array;
}

public static int[] concatenate(int less[],int greater[],int limit1,int limit2){
    int complete[] = new int[limit1+limit2];
    System.arraycopy(less,0,complete,0,limit1);
    System.arraycopy(greater,0,complete,limit1,limit2);
    return complete;
}

共 (1) 个答案

  1. # 1 楼答案

    主要问题来自这一行:

    if(menor.length>=1&&mayor.length>=1)
    

    应该是哪一个

    if(j>=1&&k>=1)
    

    为什么?第一种说法总是正确的,当所有被划分的元素都等于或小于轴心时,所有元素都将按照它们出现的顺序排列。在执行完全相同的分区的函数上再次调用quicksort,会得到一个无限循环。根据menor或mayor数组的大小,程序首先会出现堆栈溢出或内存错误

    即使你改变了上面这一行,你的那一类也不会像你现有的那样有效。为什么?嗯,有几个原因。首先是排队

    if(menor.length>mayor.length)
    

    应该是

    if(j>k)
    

    然而,这只是问题的一部分。当mayor或menor包含函数输入的所有元素时,您将不会继续对其进行排序。但是,如果将它们发送到quicksort,那么仍然可以有一个无限循环。我建议将pivot与输入到quicksort的数组的其余部分分离(例如,将其与第一个元素交换),并对数组的其余部分进行分区。然后,在对已分区的mayor和menor数组进行快速排序后,将枢轴放置在它们之间

    祝你好运