zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C++快速排序

C++排序 快速
2023-09-14 09:12:43 时间

若按左小右大的方式排序,它首先选择最左边为基准值,然后定义int i,j
两个下标变量,i指向左数第二个数,j指向最后一个数。总体上来说排序的业务就是,让 i 左边的值都比基准值小,j 右边的值都比基准值大,然后
i 向右移,带动 j 向左移。具体业务:全部由i指向的数来跟基准数比较,若小于基准值,i++ 。若大于则i位置的数与j位置的数互换,换后
j-- ,i并不加一,因为此时 i 位置的数依然有可能大于基准值,因此再比较一次。此时依然有两种情况跟上所述一样(注意这时 j
已将向左移动一位了)。接下来若是 i ++
的情况,i++位置上的数跟基准值比较,比较的两种情况跟上述一样。第一次接触可能有些不好理解,因为它的业务有迭代的思路,建议拿笔在纸上按刚才的表述模拟一下便更易明白。
i 跟 j
一直靠近,直到相等。此时再把这个位置上的值跟基准值比较,判断大小。然后把左边小于基准值的与右边大于基准值的看成两个分区,基准值分别取两个分区最左边的值,在两个分区里分别执行上述的业务。后边变成四个分区,继续迭代下去。最后你会神奇的发现整个数组有序,用一个小数组,在纸上模拟一遍体会更易体会。

为何最后是有序的: 实现方法,整个数据块A分出去一个数据块B
数据块B满足最后一个数大于第一个数(把满足此条件的数据块成为类B数据块),A则变为C(把不满足类B的叫作类C数据块);
B和C都按照A的方式进行迭代,这样下去,从数据块的角度来说,左边的小于右边的,因此只需要把每个数据块内部排序好就行.
类B和类C每次一分为二时,总会分别分离出一个类B和类C
类B完成排序的原因是分割成一个个满足类B条件的数据块,直到只有两个数据,依然满足类B条件所有完成排序.
类C数据块完成排序的原因是,一直把自己的一部分分离成类B让他们去排序,直至最后还剩两个数据,这时第一个作为基准数,经程序与第二个交换完成排序.

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;

int data[10] = {0, 2, 1, 4, 3, 6, 5, 8, 7, 9};
void swap(int i = 0, int j = 0)
{
    // cout << " data[i] " << i << " : " << data[i] << endl;
    // cout << " data[j] " << j << " : " << data[j] << endl;
    int int_temp = 0;
    int_temp = data[i];
    data[i] = data[j];
    data[j] = int_temp;
}


void quick(int start = 0, int end = 0)
{
    if (start >= end)
    {
        return;
    }
    int i = start + 1;
    int j = end;
    int int_base = data[start];
    while (i < j)
    {
        if (data[i] > int_base)
        {
            swap(i, j);
            j--;
        }
        else
        {
            i++;
        }
    }
    //i == j时
    if (data[i] > int_base)
    {
        swap(data[start], data[i - 1]);
        quick(start, i - 1);
        quick(i, end);
    }
    else
    {
        swap(data[start], data[i]);
        quick(start, i);
        quick(i + 1, end);
    }
}

int main(void)
{
    quick(0, 9);
    for (int i = 0; i < 10; i++)
    {
        cout << i << " : " << data[i] << endl;
    }
    return 0;
}

哎呦喂ヾ(✿゚▽゚)ノ~路长馆小,雪轻帘薄,酒热乎,这位爷~您ヾ(✿゚▽゚)ノ~ 里面坐~
本公众号专注分享C++,ffmpeg,opencv等相关音视频知识
webrtc,udp,tcp,rtsp,rtmp,srt/nginx+rtmp等流媒体协议和服务器
同时也会有大厂音视频技术专家不定期直播分享…
国人开发流媒体srs服务器,及yangrtc(国人版的webrtc)协议新动向
偶尔分享下程序员梦呓碎碎念(๑•॒̀ ູ॒•́๑)啦啦啦
目前刚刚开通,接受读者的优质投稿…
鉴于国内音视频圈子小,起步晚,以致分享少,门槛高,特开通分享,一起扇动这阵风吧!
微信扫描下方二维码,关注公众号,赶快进入音视频开发者社区吧!