快速排序 过程 动画展示


概述

总体上快排使用分治法的策略。

每一趟做的事情

  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