这个快速排序代码有什么问题

时间:2016-12-06 05:40:34

标签: java sorting quicksort

我花了好几个小时看这个快速排序代码。请帮我找错。它报告运行时错误。在代码中,我将第一个元素a [l]作为支点。

1-64

2 个答案:

答案 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=0h=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] + "");
    }
}