快速排序(模板)


快速排序原理如下:

我們在排序的時候,用到了划分的思想,隨機選擇一個中軸,雙指針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);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM