Java 我的快速排序算法运行太慢
我正在使用快速排序算法对32位随机整数进行排序。当我对10、100或1000个元素进行排序时,算法运行得很快,但当我选择n=10.000时,排序大约需要15分钟。我想把n增加到10000000,但那个么算法将花费永远的时间。我无法发现我的实现中有什么错误 这是我的主要功能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
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函数的时间进行比较,以获得更好的想法