快速排序原理如下:
我們在排序的時候,用到了划分的思想,隨機選擇一個中軸,雙指針i, j,指針i從左往右掃描,指針j從右往左掃描,如果i < j 則進行交換,並且繼續循環,直到遇到中軸,這時候我們的i和j均為中軸(理由:因為i,j相等)。我們在中軸左右遞歸,假設遞歸到了最后,也就交換了最后兩個數。
時間復雜度分析,我們每次從l 掃描到 r,復雜度為T(n),左邊遞歸,右邊遞歸,時間復雜度為T(1/2 n), 接着繼續往下進行。
快速排序是一個不穩定的排序算法。
\[T(n) = 2 T(n/2) + n \\ T(n) = 2 T(2 T(n/4) + n/2) + n = 4 T(n/4) + 2n \\ T(n) = 4 T(2 T(n/8) + n/4) + 2n = 8 T(n/8) + 3n \\ ... \\ T(1) = 0 \\ T(n) = n T(1) + (log(n)) * n = O(n logn) \]
void quick_sort(int *q, int l, int r) {
if(l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while(i < j) {
do i++; while(q[i] < x);
do j--; while(q[j] > x);
if(i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j); quick_sort(q, j + 1, r);
}