gpt4 book ai didi

java - Java 快速排序实现中的 OutOfMemoryError

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:02 25 4
gpt4 key购买 nike

我正在尝试实现一个快速排序算法,我已经阅读了如何使用伪代码来实现它,并且由于我正在学习 Java(因为几个月前我已经在 C++ 中完成了快速排序),所以我想将其实现为这样语言,但每当我尝试运行它时都会遇到 stackoverflow 或堆空间问题,你能检查我的代码吗? :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)情况:

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;
}

最佳答案

主要问题源于这一行:

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

应该是

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

为什么?好吧,第一个陈述总是正确的,当所有被划分的元素都等于或小于主元时,所有元素都将按照它们进来的顺序完全相同。快速排序在函数上再次调用它做完全相同的分区,你会得到一个无限循环。根据您制作 menor 或 mayor 数组的大小,程序首先会因堆栈溢出或内存错误而出错。

即使您更改上面的行,您的排序也不会像您拥有的那样工作。为什么?好吧,有几个原因。一、线路

if(menor.length>mayor.length)

应该是

if(j>k)

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

祝你好运。

关于java - Java 快速排序实现中的 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4262483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com