Java中的快速排序实现中的OutOfMemoryError
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java中的快速排序实现中的OutOfMemoryError,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3762字,纯文字阅读大概需要6分钟。
内容图文
我正在尝试实现Quicksort算法,我已经阅读了如何使用伪代码来实现它,并且由于我正在学习Java(因为几个月前我已经在C语言中完成了quicksort),所以我想将其实现为这种语言,但是每当我尝试运行它时,都会遇到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 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)
为什么?好吧,第一个语句始终是正确的,并且当所有被分区的元素都等于或小于枢轴时,所有元素都将以它们进入的完全相同的顺序进入市长.函数再次调用quicksort进行完全相同的分区,您会遇到无限循环.根据堆栈大小或市长数组的大小,程序首先在堆栈溢出或内存错误时出错.
即使您更改了上面的行,您的排序也无法正常进行.为什么?好吧,有几个原因.一,行
if(menor.length>mayor.length)
应该
if(j>k)
但是,这只是问题的一部分.当市长或市长包含该函数的所有输入元素时,您将不会继续对其进行排序.但是,如果将它们发送到quicksort,则仍然会出现无限循环.我建议将枢轴与输入到quicksort的其余数组分开(例如,将其与第一个元素交换),并对其余数组进行分区.然后,在对这些阵列进行快速排序后,将枢轴放置在分区的市长阵列和Menor阵列之间.
祝好运.
内容总结
以上是互联网集市为您收集整理的Java中的快速排序实现中的OutOfMemoryError全部内容,希望文章能够帮你解决Java中的快速排序实现中的OutOfMemoryError所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。