手寫快速排序(java實現)
時間複雜度:java
O(nlogn)數組
快速排序原理:ui
- 定義一個基準元素base(我這裏定義的是最左面的元素定位基準元素)
- 定義兩個變量i和j
- j先從右向左遍歷,找到第一個比base小的數就中止
- i再從左向右便利找到第一個比base大的數中止
- 交換i和j指向的元素
- 直到i和j指向同一個元素,將這個元素與基準元素交換
- 遞歸求解便可
圖解:(排序過程)spa
注意:code
上圖爲第一次快速排序的過程,遞歸過程和上圖一致(沒有給出)blog
每一次的排序結果:排序
如今在火車上沒有給出具體每次排序結果,回學校補上.遞歸
Java代碼實現:class
package cn.csuft.poorguy.struct; public class quickSortText { public static void main(String[] args) { int[] arr = { 3, 4, 1, 2, 6, 9, 8, 5, 7 }; quickSort(arr, 0, arr.length - 1); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } public static void quickSort(int[] arr, int left, int right) { //數組最左邊小於最右邊不合法,直接退出 if (left > right) { return; } //定義變量i指向最左邊 int i = left; //定義變量j指向最右邊 int j = right; //定義左邊爲基準元素base int base = arr[left]; //只要i和j沒有指向同一個元素,就繼續交換 while (i != j) { //從右向左尋找第一個小於基準元素的數 while (arr[j] >= base && i < j) { j--; } //從左向右尋找第一個大於基準元素的數 while (arr[i] <= base && i < j) { i++; } //執行到這裏證實找到了i和j指向的元素 //交換i和j指向的元素 int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } //將i和j共同指向的元素與基準元素交換 arr[left] = arr[i]; arr[i] = base; //對左邊進行快速排序 quickSort(arr, left, i - 1); //對右邊進行快速排序 quickSort(arr, i + 1, right); } }