C++快速排序
若按左小右大的方式排序,它首先选择最左边为基准值,然后定义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)协议新动向
偶尔分享下程序员梦呓碎碎念(๑•॒̀ ູ॒•́๑)啦啦啦
目前刚刚开通,接受读者的优质投稿…
鉴于国内音视频圈子小,起步晚,以致分享少,门槛高,特开通分享,一起扇动这阵风吧!
微信扫描下方二维码,关注公众号,赶快进入音视频开发者社区吧!
相关文章
- c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)
- C/C++基础讲解(十三)之数据结构篇排序大比拼
- 蓝桥杯官网 试题 PREV-229 历届真题 子串分值和【第十一届】【决赛】【研究生组】【C++】【C】【Java】【Python】四种解法
- C++数据结构-- 递归 排序
- C++11 左值、右值、右值引用详解
- 【 华为OD机试 2023】字符串重新排序(C++ Java JavaScript Python)
- 【 华为OD机试 2023】 最大连续文件之和 / 区块链文件转储系统(C++ Java JavaScript Python)
- 复习C++标准库多线程的基本使用
- VC++ 从 CString类型的文件路径中获取文件名和扩展名
- AI模型C++部署:ubuntu安装Cython并使用C/C++调用python动态库【附加c++与python互相调用算法demo程序接口的源码】
- Ubuntu20.04下,qt交叉编译报错::15: warning: identifier ‘nullptr‘ is a keyword in C++11 [-Wc++0x-compat]
- C++之读写文件操作(fread/fwrite)(七十七)
- 【C++】算法集锦(1):八大排序算法 :GIF + 亲测代码 +专项练习平台