(一)快速排序算法
快速排序的基本思想:經過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另外一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。app
1.算法描述;ide
(1)從數列中挑出一個元素,稱爲 「基準」(pivot);ui
(2)從新排序數列,全部元素比基準值小的擺放在基準前面,全部元素比基準值大的擺在基準的後面(相同的數能夠到任一邊)。在這個分區退出以後,該基準就處於數列的中間位置。這個稱爲分區(partition)操做;spa
(3)遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。 code
2.手動模擬排序:blog
3.算法分析:排序
(1)最佳狀況:平均狀況:T(n) = O(nlogn) 遞歸
(2)空間複雜度: O(logn)it
(3)穩定性: 不穩定
(二)代碼實現:
public class QuickSort { public static void main(String[] args) { int[] arr = {3,4,1,2,7,8,6,5,9}; sort(arr);//快速排序 System.out.println("-----------------------------------------"); print(arr);//打印結果 } public static void sort(int[] arr){ if(arr == null || arr.length <= 1){ return; } sort(arr,0,arr.length - 1); } private static void sort(int[] arr, int left, int right) { //邊界 if(left >= right){ return; } //獲取基數 int pivot = arr[left]; int index = partition(arr,left,right); sort(arr,left,index - 1); sort(arr,index + 1,right); } private static int partition(int[] arr, int left, int right) { int pivot = arr[left]; while (left < right) { while (left < right && arr[right] >= pivot) { right--; } arr[left] = arr[right]; // arr[left++] = arr[right]; while (left < right && arr[left] <= pivot) { left++; } // arr[right--] = arr[left]; arr[right] = arr[left]; } // left == right arr[left] = pivot; print(arr); return left; } public static void print(int[] arr){ StringBuilder sb = new StringBuilder("["); for (int i = 0; i < arr.length; i++) { sb.append(arr[i]); if(i != arr.length - 1){ sb.append(", "); } } System.out.println(sb.append("]")); } }