快速排序Java

时间:2013-11-17 21:11:48

标签: java sorting quicksort

您好我正在努力让我的快速排序程序正常工作,但无法弄清楚我哪里出错了,我花了几个小时试图找出它为什么不起作用但没有运气,当我运行我的代码时没有任何反应。我还有其他四种排序算法以类似的方式工作,这让我感到困惑。 以下是我的快速排序程序代码

import java.io.IOException;

public class QuickSort  {



public static int[] compute(int[] array, int lower, int higher )throws IOException{

    if(lower<higher){
        int pivot=split(array,lower,higher);
        if(pivot>1)
            compute(array, lower, pivot-1);

        if(pivot+1<higher)
            compute(array, pivot+1, higher);


    }

    return array;

}


public static int split(int[] array, int lower, int higher){

    while(true){
        int pivot=array[lower];

        while(array[lower]<pivot)
            lower++;

        while(array[higher]>pivot)
            higher--;


        if(lower<higher){

            int temp=array[higher];
            array[higher]=array[lower];
            array[lower]=temp;
        }
        else{
        return higher;
    }
    }
}

}

这是我正在运行代码的Test类:

import java.io.IOException;
import java.util.Scanner;


public class Test extends ReadIn{ 

static BubbleSort bubble=new BubbleSort();


  public static void main(String[] args) throws IOException{
  System.out.println("Enter 1 for BubbleSort\nEnter 2 for Insertion Sort\nEnter 3      for Selection Sort\nEnter 4 for Merge Sort\nEnter 5 for QuickSort\nPlease input sorting algorithm to use for sorting:");
  Scanner input=new Scanner(System.in);
  int number=input.nextInt();
  final long startTime = System.currentTimeMillis();
  int[] Array=read();

  if(number==1){
      Array=BubbleSort.compute(Array);
        for(int i=0;i<BubbleSort.compute(Array).length;i++){
      System.out.println(Array[i]);

    }

  }
  if(number==2){
      Array=InsertionSort.compute(Array);
        for(int i=0;i<InsertionSort.compute(Array).length;i++){
      System.out.println(Array[i]);

    }

  }
  if(number==3){
      Array=SelectionSort.compute(Array);
        for(int i=0;i<SelectionSort.compute(Array).length;i++){
      System.out.println(Array[i]);

    }

  }
  if(number==4){
      Array=MergeSort.compute(Array);
        for(int i=0;i<MergeSort.compute(Array).length;i++){
      System.out.println(Array[i]);

    }

  }
  if(number==5){
  Array=QuickSort.compute(Array,0,Array.length-1);
        for(int i=0;i<QuickSort.compute(Array,0,Array.length-1).length;i++){
      System.out.print(Array[i]);

    }

  }


    final long endTime = System.currentTimeMillis();
    System.out.println("Total execution time: " + (endTime - startTime) );
}





}

当我按下5没有任何反应时,其余的工作完美无缺。 我无法弄清楚问题是什么,所以任何帮助或输入都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

如果输入中存在重复的数字,您的Quicksort代码将永远循环,因为数字可以保持相互交换。如评论中所述,您应该使用示例数组手动尝试代码,或者检查使用debugger运行的代码。请参阅下面的示例数组。

您可能希望将while(true)循环切换为递归调用,以使代码更清晰一些。此外,您可以在Quicksort online tutorial上练习快速浏览Quicksort的各个步骤。

说数组= {3,1,2,3},数据透视为3.没有什么会改变,代码将永远循环。

while(true){
    int pivot=array[lower];

    while(array[lower]<pivot)
        lower++;

    while(array[higher]>pivot)
        higher--;


    if(lower<higher){   //this will just swap the 3's with each other. 
        int temp=array[higher];
        array[higher]=array[lower];  
        array[lower]=temp;
    }
    else{
      return higher;
    }
}

答案 1 :(得分:1)

虽然看起来你的程序什么都不做,但它可能只是在这个循环中无限循环:

while(true){
    int pivot=array[lower];

    while(array[lower]<pivot)
        lower++;

    while(array[higher]>pivot)
        higher--;


    if(lower<higher){

        int temp=array[higher];
        array[higher]=array[lower];
        array[lower]=temp;

        // I recommend adding this line for you to see what's going on
        System.out.println("lower="+lower+", higher="+higher+", pivot="+pivot);
    }
    else{
        return higher;
    }
}

例如,如果您的数组中的值相等,那么值65就是两次,该循环将永远运行...

int[] Array={1,41,2,90,32,65,12,43,78,65,46,67};

此外,在上面的循环中,我添加了额外的打印输出更高,更低和透视值 - 它将帮助您了解在这个狡猾的循环中发生的事情。

一般来说,写一段时间(真实)循环不是一个好习惯,因为挂起系统很容易。