Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的快速排序算法运行太慢_Java_Algorithm_Quicksort - Fatal编程技术网

Java 我的快速排序算法运行太慢

Java 我的快速排序算法运行太慢,java,algorithm,quicksort,Java,Algorithm,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 Dat

我正在使用快速排序算法对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;
    }
}

任何帮助都将不胜感激

您错误地假设下限为零,而不是保留在几个位置,因此您所做的工作比您需要的要多:

在quickSortint left和int right中:

quickSort0,分区1; 到 quickSortleft,分区1

在左分区、右整数、大整数轴中:

whilerightCursor>0&&my_数组[-rightCursor].compareTopivot==1; 到
whilerightCursor>left&&my_数组[-rightCursor].compareTopivot==1

您错误地假设下限为零,而不是保留在几个位置,因此您所做的工作比您需要的要多:

在quickSortint left和int right中:

quickSort0,分区1; 到 quickSortleft,分区1

在左分区、右整数、大整数轴中:

whilerightCursor>0&&my_数组[-rightCursor].compareTopivot==1; 到
whilerightCursor>left&&my_数组[-rightCursor].compareTopivot==1

如果您需要32位整数,这正是int的含义-不要使用BigInteger。比较BigInteger比比较整数要花更多的时间。@如果你是对的,但我需要32位随机整数,如果我不使用BigInteger.int not_so_big_int=rand.nextingInteger.MAX_VALUE,我不知道如何创建随机32位整数@alfasin对于一个32位整数,只有10个数字,而BigInteger比较类似于字符串比较,字符串比较是打开的,所以这不是一个大问题。@Phamtrong说他使用的是一个1M元素数组,比较之间的差异是1毫秒,这意味着假设快速排序需要n*logn比较,则两种方法之间的差异超过0.001*1000000*log1000000=1000*6=6000秒。由于快速排序最糟糕的情况是n^2,它可能需要更长的时间…如果您需要32位整数,这正是int的含义-不要使用biginger。比较BigInteger比比较整数要花更多的时间。@如果你是对的,但我需要32位随机整数,如果我不使用BigInteger.int not_so_big_int=rand.nextingInteger.MAX_VALUE,我不知道如何创建随机32位整数@alfasin对于一个32位整数,只有10个数字,而BigInteger比较类似于字符串比较,字符串比较是打开的,所以这不是一个大问题。@Phamtrong说他使用的是一个1M元素数组,比较之间的差异是1毫秒,这意味着假设快速排序需要n*logn比较,则两种方法之间的差异超过0.001*1000000*log1000000=1000*6=6000秒。由于快速排序最糟糕的情况是n^2,它可能需要更长的时间…@vandale你知道对100万个32位整数进行排序需要多长时间吗?approximately@bug您可以将时间与内置Arrays.sort函数的时间进行比较,以获得更好的结果idea@vandale你知道对一百万个32位整数排序需要多长时间吗?approximately@bug您可以将时间与内置Arrays.sort函数的时间进行比较,以获得更好的想法