【排序】圖解快速排序
阿新 • • 發佈:2018-11-29
一、思想
與歸併排序相同,快速排序也是用分支的思想。首先從陣列中隨機選取一個元素最為基準數,將該元素交換的陣列的最後一位。將所有小於基準數的放置在左邊,大於基準數的放置在右邊,中間剩下的是等於基準數的元素,這時將基準數交換到中間,形成了一個以基準數為中心左右分治的陣列,左面的元素都小於基準數,右邊的元素都大於基準數。這時,分別將左右兩個大於基準數與小於基準數的序列遞迴重新執行上述步驟,即可得到最終有序的陣列。
二、圖解過程
三、核心程式碼
//快速排序
public static void quickSort(int[] arr, int l, int r) {
if (l < r) {
swap(arr, l + (int) (Math.random() * (r - l + 1)), r);//隨機選取一個基準數
int[] p = partition(arr, l, r);//小於區域[0,p[0]] 大於區域[p[1],r]
quickSort(arr, l, p[0] - 1);
quickSort(arr, p[1] + 1, r);
}
}
//以基準數為界,大的在右邊,小的在左邊 基準數放置在陣列的最後一位
public static int[] partition(int[] arr, int l, int r) {
int less = l - 1;
int more = r;
while (l < more) {
if (arr[l] < arr[r]) {
swap(arr, ++less, l++);
} else if (arr[l] > arr[r]) {
swap(arr, --more, l);
} else {
l++;
}
}
swap(arr, more, r);
//返回值分別為小於序列與大於序列的分界線
return new int[] { less + 1, more };
}
四、複雜度分析
1、時間複雜度
最壞時間複雜度:O(N^2)
平均時間複雜度:O(NlogN)
。
2、額外空間複雜度
未藉助其它輔助空間。