快速排序: 它的基本思想是:通過一躺排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一不部分的所有數據都要小, 然後再按次方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。最壞情況的時 間複雜度為O(n2),最好情況時間複雜度為O(nlog ...
快速排序:
它的基本思想是:通過一躺排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一不部分的所有數據都要小,
然後再按次方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。最壞情況的時
間複雜度為O(n2),最好情況時間複雜度為O(nlog2n)。
圖解:
我已經將代碼的關鍵步驟都大了註釋,希望可以幫助理解。
//瞎打快排
package sdx;
import java.util.Arrays;
public class Main6 {
public static void quickSort(int[] arr,int left,int right){
int i,j,JiShu;
if(left>right){
return;//當左邊大於右邊時,方法不合法,所以return結束這個方法
}
//定義哨兵
i=left;
j=right;
//JiShu就是基準位
JiShu = arr[left];
//當i和j不相遇時,再迴圈中進行檢索。
while (i!=j) {
//先看右邊,依次往左遞減S
while (JiShu<=arr[j]&&i<j) {//i<j是為了是為了不讓在i和j相遇時錯過。
j--;//哨兵j向左繼續移動。
}
//再看左邊,依次往右遞增
while (JiShu>=arr[i]&&i<j) {
i++;//哨兵i向右繼續移動。
}
//如果滿足條件則交換
if (i<j) {
int t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最後將基準為與i和j相等位置的數字交換(遞歸大法)
//定義時左邊第一個為 “基數”。將重合時的數與基數交換。將重合後的數放在左邊第一個。
arr[left] = arr[i]; //a[i]與a[j]都可以,因為i,j重合,位置相同。
arr[i] = JiShu; //將新數列的基數設置為最左邊那個數。
//遞歸調用左半數組
quickSort(arr, left, j-1);//調用自身
//遞歸調用右半數組
quickSort(arr, i+1, right);
}
public static void main(String[] args) {
int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
System.out.println("排序前的數組:"+Arrays.toString(arr));
quickSort(arr, 0, arr.length-1);
System.out.print("排序後的數組:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
運行截圖: