這種排序的每次迭代都假設減少可排序的範圍。基本上,這是一個分而治之的算法。
的pivot
找到您所指定
問題是,你將隨機化的pivot
範圍的「中」點,所以每次經過排序運行時,它比較一些隨機的部分,大概包括一些部分,您已經整理...
因此,而不是使用...
int pivot = r.nextInt(high-low+1)+low;
您應該使用...
int pivot = low + (high - low)/2;
例如...
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class QuickSort {
static String[] strings;
public static void main(String[] args) {
List<String> values = new ArrayList<>(26);
for (int index = 0; index < 26; index++) {
values.add(new String(new char[]{(char)(65 + index)}));
}
Collections.shuffle(values);
strings = values.toArray(new String[values.size()]);
System.out.println("Before");
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i] + " ");
}
System.out.println("");
qsort(0, strings.length - 1);
System.out.println("The array, quicksorted: ");
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i] + " ");
}
System.out.println("\n");
}
static void qsort(int low, int high) {
int i = low, j = high;
// Get the pivot element
int pivot = low + (high - low)/2;
String value = strings[pivot];
// Divide into two lists
while (i <= j) {
while (strings[i].compareTo(value) < 0) {
i++;
}
while (strings[j].compareTo(value) > 0) {
j--;
}
if (i <= j) {
exchange(i, j);
i++;
j--;
}
}
// Recursion
if (low < j) {
qsort(low, j);
}
if (i < high) {
qsort(i, high);
}
}
static void exchange(int i, int j) {
String temp = strings[i];
strings[i] = strings[j];
strings[j] = temp;
}
}
將會產生...
Before
N S B A F Z X J Q K V C L R W E H Y M U G I D P T O
The array, quicksorted:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Before
G U P Q D A W T R M E O X J S C I V Y F H L B N Z K
The array, quicksorted:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Before
D Z C B Q O K W X F V G R S A U P T H Y I E N L M J
The array, quicksorted:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Before
Q K H B W N J V C Y U O R P G I F D Z E L S A X M T
The array, quicksorted:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Before
R V P G E S C A H W X I T D Z B K Q F M U Y L J N O
The array, quicksorted:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Before
L O T E U D H N P J V I Q C X S Z W A R F K G Y B M
The array, quicksorted:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Before
I E J F U X P K R Q L S C O Y W G A Z B V M D H N T
The array, quicksorted:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Before
X L K T W E V J N Y G H O Q I M C P A R B F S U Z D
The array, quicksorted:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Before
U X N T K Q S V P F W C G Y O L A B E H J R D M Z I
The array, quicksorted:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Before
A J Z C M Y O Q F L K D P S X W N T I B H E R U V G
The array, quicksorted:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
NB-不要使用List
的壓力,我只是產生了一些隨機String
S;)
這段代碼是否會在同一組輸入字符串上產生錯誤的輸出,即提供了相同的輸入或不同的輸入......如果使用不同的輸入,可以發佈它給出的設置錯誤的結果 – dbw
你爲什麼使用「隨機」數據透視表? – MadProgrammer
嗨。要求人們發現代碼中的錯誤並不是特別有效。您應該使用調試器(或者添加打印語句)來分析問題,追蹤程序的進度,並將其與預期發生的情況進行比較。只要兩者發生分歧,那麼你就發現了你的問題。 (然後,如果有必要,你應該構建一個[最小測試用例](http://sscce.org)。) –