我的Quicksort算法运行得太慢了

时间:2015-03-19 04:25:31

标签: java algorithm quicksort

我使用Quicksort算法对32位随机整数进行排序。当我对10或100或1000个元素进行排序时,算法可以快速运行,但是当我选择n = 10.000时,排序大约需要15分钟。我想将n增加到10000000,但算法将永远需要。我在实施中找不到什么问题。

这是我的主要功能

 public static void main(String[] args) {

    for(int i=0; i<100; i++){

    Random rand = new Random(new Date().getTime()); //different seed for each run

    createRandArray(rand);  
    long startTime= System.nanoTime();
    sort();
    long finishTime= System.nanoTime();
    }

以下是Quicksort的实现

  public static void sort(){
        int left = 0;
        int right = my_array.length-1;
        quickSort(left, right);
    }

    private static void quickSort(int left,int right){

        if(left >= right)
            return;

        BigInteger pivot = my_array[right];
        int partition = partition(left, right, pivot);

        quickSort(0, partition-1);
        quickSort(partition+1, right);

    }

    private static int partition(int left,int right,BigInteger pivot){
        int leftCursor = left-1;
        int rightCursor = right;

        while(leftCursor < rightCursor){

                while(my_array[++leftCursor].compareTo(pivot)==-1);
                while(rightCursor > 0 && my_array[--rightCursor].compareTo(pivot)==1);

            if(leftCursor >= rightCursor){
                break;
            }
            else{
                swap(leftCursor, rightCursor);
            }
        }

        swap(leftCursor, right);
        return leftCursor;
    }

    public static void swap(int left,int right){

        BigInteger temp = my_array[left];
        my_array[left] = my_array[right];
        my_array[right] = temp;
    }

这是我创建32位rand整数数组的方法

 public static void createRandArray(Random rand ){

        BigInteger big_int=new BigInteger("1"); //initialization

        for(int i=0; i<100 ; i++){
        big_int= new BigInteger(32, rand);
        my_array[i]= big_int;
    }
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

你错误地认为在几个地方下限是零而不是left因此你做的工作比你需要的多:

quickSort(int left,int right)中的

quickSort(0, partition-1);

quickSort(left, partition-1);

partition(int left,int right,BigInteger pivot)

while(rightCursor > 0 && my_array[--rightCursor].compareTo(pivot)==1);

while(rightCursor > left && my_array[--rightCursor].compareTo(pivot)==1);