zoukankan      html  css  js  c++  java
  • 快速排序

    1、算法的原理

    QQ截图20210329155541.png

    举个栗子
    000.png
    选择分界线为第一个数 (x=3)

    任务:(i)指针(红,左)找到大于等于(3)停止,(j)指针(绿,右)找到小于等于(3)的停止。

    (1)左指针(i)指向第1个数(3),右指针(j)指向最后一个数(5)(Start!)
    (2)左指针(i)指向的是数字(3),这是大于等于(3)的(现在是等于),它停止下来。
    (3)右指针(j)指向的是数字(5),它是大于(3)的,继续向前,找到倒数第二个数(3),这个是小于等于(3)的(现在是等于),停下来。
    1.png
    (4)然后两个位置的数字进行交换,本例中是两个3,交换不交换是一样的。
    (5)两个指针分别向中间移动一位,(i++,j--)
    2222.png
    (6)现在红色指针(i)指向的(1)是小于(3)的,所以继续向后移动。
    333.png
    (7)再看(2),因为(2)也是满足小于3的,所以指针(i)继续向前移动。发现现在是(3),(3)是大于等于3的,(i)停下来。
    2.png
    (8)再看(j),(j)现在指的是(2),(2)是小于等于3的,(j)指针停下来。
    4444.png
    (9)至此,(i,j)两个指针不是相遇,而是已经穿过!!注意,是穿过!这时需要结束本次运算了,不能再交换这两个数,结果就是(j)左边的比(3)小,(j+1)及以上比(3)大。
    1.png

    C++ 代码

    #include<iostream>
    
    using namespace std;
    const int N = 100010;
    int q[N];
    
    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);
    }
    
    int main() {
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++) scanf("%d", &q[i]);
        quick_sort(q, 0, n - 1);
        for (int i = 0; i < n; i++) printf("%d ", q[i]);
        return 0;
    }
    

    还有从大到小排序的模板(仅仅改两个地方的判断符号)

    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);
    }
    
  • 相关阅读:
    假期阅读笔记三
    软件需求最佳实践阅读笔记03
    学习进度条第八周
    软件需求最佳实践阅读笔记02
    学习进度条第七周
    软件需求与分析课堂讨论一
    学习进度第五周
    软件需求最佳实践阅读笔记01
    学习进度第四周
    学习进度条第三周
  • 原文地址:https://www.cnblogs.com/littlehb/p/15000855.html
Copyright © 2011-2022 走看看