我花了好几个小时看这个快速排序代码。请帮我找错。它报告运行时错误。在代码中,我将第一个元素a [l]作为支点。
1-64
答案 0 :(得分:1)
真的无法理解你的代码。根据您的代码,另一种解决方案是:
public class sorting
{
public static int[] a = {7,2,6,4,3};
public static void quickSort(int l, int h) {
if(l>=h||l<0){
return;
}
int curStandard = l;
for(int i = h; i > l;i--){//for
if((a[i]>=a[curStandard]&&i>curStandard)||
(a[i]<=a[curStandard]&&i<curStandard)){
;
}else{//swap
int temp = a[i];
a[i] = a[curStandard];
a[curStandard] = temp;
curStandard = i;
}
}//for
quickSort(l,curStandard-1);
quickSort(curStandard+1,h);
}
public static void main (String[] args) throws java.lang.Exception
{
quickSort(0,5);
for(int s=0;s<5;s++)
System.out.print(a[s] + "");
}
}
基本思想是使用第一个元素将原点数组划分为两个sub_array,并对sub_array进行相同的操作。
答案 1 :(得分:1)
在调用quickSort(l,h)
时,您的代码中的值为l=0
和h=2
。这些值使if if(l<h)
语句成立,函数一次又一次地递归,实际上是5,657次。具有讽刺意味的是,你得到StackOverflowError
。我认为,运行时错误发生了,因为你试图递归太深。
这是输出:
Exception in thread "main" java.lang.StackOverflowError
at java.io.PrintStream.write(PrintStream.java:480)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.write(PrintStream.java:527)
at java.io.PrintStream.print(PrintStream.java:669)
at java.io.PrintStream.println(PrintStream.java:806)
at sorting.quickSort(sorting.java:26)
... this error occurs 1024 times ...
您的逻辑存在问题。
我确定您通过在代码中添加以下行来进行过多的递归:
a[l] = a[y-1];
a[y-1] = k;
System.out.println("l: "+l+" y: "+y); // I added this line.
quickSort(l,y); // this is line 26 that the errors were mentioning
quickSort(y+1,h);
我不确定if语句之外的所有其他交换是什么。
import java.util.*;
import java.lang.*;
import java.io.*;
class sorting
{
public static int[] a = {7,2,6,4,3};
public static void quickSort(int l, int h) {
if(l<h) {
for(int g=l+1; g<h; g++) {
if(a[g]<=a[l]) {
int t = a[g];
a[g] = a[l];
a[l] = t;
}
}
quickSort(++l,h);
}
}
public static void main (String[] args) throws java.lang.Exception
{
// updated this area incase more numbers are added.
quickSort(0,a.length);
for(int s=0;s<a.length;s++)
System.out.print(a[s] + "");
}
}