Java 为什么快速排序比泡泡排序慢得多?
我想知道为什么我的快速排序这么慢。对以下数组进行排序需要10-20秒。Bubblesort(如下所示)会自动执行此操作Java 为什么快速排序比泡泡排序慢得多?,java,algorithm,quicksort,bubble-sort,Java,Algorithm,Quicksort,Bubble Sort,我想知道为什么我的快速排序这么慢。对以下数组进行排序需要10-20秒。Bubblesort(如下所示)会自动执行此操作 public static void quickSort(int[] tab, int lowIndex, int highIndex) { if (tab == null || tab.length == 0) { return; } int i = lowIndex; int j = highIndex; int pivot = tab[lowIndex + (
public static void quickSort(int[] tab, int lowIndex, int highIndex) {
if (tab == null || tab.length == 0) {
return;
}
int i = lowIndex;
int j = highIndex;
int pivot = tab[lowIndex + (highIndex - lowIndex) / 2];
while (i <= j) {
while (tab[i] < pivot) {
i++;
}
while (tab[j] > pivot) {
j--;
}
if (i <= j) {
int c = tab[i];
tab[i] = tab[j];
tab[j] = c;
i++;
j--;
}
if (lowIndex < j) {
quickSort(tab, lowIndex, j);
}
if (i < highIndex) {
quickSort(tab, i, highIndex);
}
}
}
public static void bubbleSort(int[] arr) {
int n = arr.length - 1;
while (n >= 1) {
for (int i = 0; i < n; i++) {
if (arr[i] > arr[i + 1]) {
int c = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = c;
}
}
n--;
}
}
public static void main(String[] args) {
int[] t = new int[] { 5, 1, 33, 13, 21, 2, 12, 4,
2, 3, 53, 2, 125, 23, 53, 523, 5, 235, 235, 235, 23, 523, 1,
2, 41, 2412, 412, 4, 124, 1, 241, 24, 1, 43, 6, 346, 457, 56,
74, 5, 3, 5, 1, 33, 13, 21, 2, 12, 4,
2, 3, 53, 2, 125, 23, 53, 523, 5, 235, 235, 235, 23, 523, 1,
2, 41, 2412, 412, 4, 124, 1, 241, 24, 1, 43, 6, 346, 457, 56,
74, 5, 3, 74, 5, 3, 5, 1, 33, 13, 21, 2, 12, 4,
2, 3, 53, 2, 125, 23, 53, 523, 5, 235, 235, 235, 23, 523, 1,
2, 41, 2412, 412, 4, 124, 1, 241, 24, 1, 43, 6, 346, 457, 56,
74, 5, 3 };
publicstaticvoidquicksort(int[]选项卡,int-lowIndex,int-highIndex){
如果(tab==null | | tab.length==0){
返回;
}
int i=低指数;
int j=高指数;
int pivot=tab[lowIndex+(highIndex-lowIndex)/2];
而(我){
j--;
}
如果(i=1){
对于(int i=0;iarr[i+1]){
int c=arr[i];
arr[i]=arr[i+1];
arr[i+1]=c;
}
}
n--;
}
}
公共静态void main(字符串[]args){
int[]t=新的int[]{5,1,33,13,21,2,12,4,
2, 3, 53, 2, 125, 23, 53, 523, 5, 235, 235, 235, 23, 523, 1,
2, 41, 2412, 412, 4, 124, 1, 241, 24, 1, 43, 6, 346, 457, 56,
74, 5, 3, 5, 1, 33, 13, 21, 2, 12, 4,
2, 3, 53, 2, 125, 23, 53, 523, 5, 235, 235, 235, 23, 523, 1,
2, 41, 2412, 412, 4, 124, 1, 241, 24, 1, 43, 6, 346, 457, 56,
74, 5, 3, 74, 5, 3, 5, 1, 33, 13, 21, 2, 12, 4,
2, 3, 53, 2, 125, 23, 53, 523, 5, 235, 235, 235, 23, 523, 1,
2, 41, 2412, 412, 4, 124, 1, 241, 24, 1, 43, 6, 346, 457, 56,
74, 5, 3 };
基本上,您的冒泡排序在某种程度上被破坏了-使用Darren Engwirda在他的评论中链接到的实现,每次使用新创建的数组运行排序,我得到以下时间:
bash-3.1$ time java -cp bin Sort none
real 0m0.079s
user 0m0.000s
sys 0m0.015s
bash-3.1$ time java -cp bin Sort quick
real 0m0.084s
user 0m0.015s
sys 0m0.015s
bash-3.1$ time java -cp bin Sort bubble
real 0m0.115s
user 0m0.000s
sys 0m0.000s
其中,运行三个测试的基础结构是:
private static int[] data () {
return new int[] { ... the same data as in the OP ... };
}
public static void main(String[] args) {
if ( args.length == 0 || args [ 0 ].equals ( "bubble" ) ) {
for ( int i = 0; i < 1000; ++i ) {
int[] data = data();
bubbleSort ( data );
}
} else if ( args [ 0 ].equals ( "none" ) ) {
for ( int i = 0; i < 1000; ++i ) {
int[] data = data();
}
} else if ( args [ 0 ].equals ( "quick" ) ) {
for ( int i = 0; i < 1000; ++i ) {
int[] data = data();
quickSort( data, 0, data.length-1 );
}
} else if ( args [ 0 ].equals ( "quick_op" ) ) {
for ( int i = 0; i < 1000; ++i ) {
int[] data = data();
quickSort_op( data, 0, data.length-1 );
}
}
}
它仍然比冒泡排序快,但不如其他实现快-我认为您可能会重叠j和I并多次访问数组的某些部分。对于小数据集来说,快速排序似乎较慢,因为您的快速排序实现包含递归调用。bubblesort的最坏情况complexity为n^2。wortcase快速排序的复杂性为n*ln(n)。这些都是最糟糕的情况,对个别情况没有任何说明。您的数据有多随机?有多大?以及“自动”意味着什么?对于我的代码中的数组,快速排序时间约为15秒,气泡排序时间小于1秒。@bmorris591代码示例似乎包含一些示例数据。您的
快速排序似乎不正确。recursive调用不应出现在while(i)中
bash-3.1$ time java -cp bin Sort op_quick
real 0m0.108s
user 0m0.015s
sys 0m0.015s