快速排序 過程 動畫展示


概述

總體上快排使用分治法的策略。

每一趟做的事情

  1. 選定一個比較的元素(a[i]), 然后把這個元素拿到臨時變量 ( x ) 中(也稱作把這個元素 x 挖出來 或者在元素的位置( i ) 上挖一個坑)
  2. 把所有比x小的元素都移到 X 的左邊
  3. 把所有比x大的元素都移到 X 的右邊
  4. 遞歸 比 x 小的元素 (0 - i-1)
  5. 遞歸 比 x 大的元素( i+1 , r )

理解的難點

理解的難點可能在於如何進行2 3 步以及這個坑又是怎樣用的這里。
如下面代碼

  1. 首先使用 i 作為要挖的坑。
  2. 從 j 向左找 a[j] 比 x 小的元素
    2.1 找到之后把 j的元素挖出來 填到i上,這樣坑i就被填上了,這次留了一個新的坑 j (下次就填這個坑)
    2.2 更新 i 的位置
  3. 從 i 向右找 a[i] 比 x 大的元素
    3.1 找到之后把此時的 i 挖出來填到 j 的坑上 這樣坑 j 就被填上了,此時 i 所在的位置是一個新的坑
    3.2 更新j的位置

找到最后

  1. 當 i 的元素填到 j 的時候,i 為坑,j--
  2. 當 j 的元素填到 i 的時候,j為坑,i++
  3. 直到 i == j 跳出循環

然后再把最開始拿到的,用來比較的數放到 a[i] 的地方。
a[i] = x

使用代碼

#include <cstdio>
void quick_sort(int a[], int l, int r) {
    if (l < r) {
        int i = l;
        int j = r;
        int x = a[i];
        while (i < j) {
            while (i < j && a[j] > x) {
                j--;
            }
            if (i < j) {
                a[i++] = a[j];
            }
            while (i < j && a[i] < x) {
                i++;
            }
            if (i < j) {
                a[j--] = a[i];
            }
        }
        a[i] = x;
        quick_sort(a, l, i - 1);
        quick_sort(a, i + 1, r);
    }
}

int main(void) {
    int a[] = {9,8,20,2,11};
    quick_sort(a, 0, 4);
    for (auto &i : a) {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}

動畫

 

參考鏈接

1


免責聲明!

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



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