本質來說,快速排序的過程就是不斷地將無序元素集遞歸分割,一直到所有的分區(qū)只包含一個元素為止。主要就是將數組以一個數組內隨機的基準數進行分隔,比基準數小的在左邊比基準數大的在右邊,即從兩側向內遍歷。
排序過程:
- 當遍歷右側有數據小于基準數,停止遍歷,來到左側遍歷至有數據大于基準數將。將這兩者數據互換。
- 一直到兩者 遍歷至同一個下標,停止,將基準數與該下標對應的數據互換。
- 現在的狀態(tài)是基準數左邊的都小于基準數,基準數右邊的都大于基準數。
- 這時候,我們再以基準數為分割,以同樣的方式對基準數左側及右側分別排序。
- 以這樣遞歸的方式,一直到基準數左右各只有一個元素停止,這時候排序結束。
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[] { 1, 4, 2, 5, 2, 3, 6, 45, 234, 234, 5435,
546546, 1, 2, 3, 4, 5 };
int[] dividerSort = quickSort(arr);
System.out.print("最終結果:"+Arrays.toString(dividerSort));
}
public static int[] quickSort(int[] arr) {
return dividerSort(arr, 0, arr.length-1);;
}
public static int[] dividerSort(int[] arr, int left, int right) {
if(left>right)
return null;
int i=left;
int j = right;
int current = arr[left];
while (i != j) {
while (arr[j] >= current && i < j) {
j--;
}
while (arr[i] <= current && i < j) {
i++;
}
if (i < j) {
toChange(arr, i, j);
}
}
arr[left]=arr[i];
arr[i]=current;
dividerSort(arr, left, i-1);
dividerSort(arr, i+1, right);
return arr;
}
public static int[] toChange(int[] arr, int i, int j) {
int c = arr[j];
arr[j] = arr[i];
arr[i] = c;
return arr;
}
}
時間復雜度:nlog(n)