c++中快速排序

引言

快速排序一直是排序算法中使用比较高频的一种算法。下面简述一下快排,予以记录。

实现思想

在一组无序的数组中,定义一个标志flag,这里以数组中左起第一个元素作为标志,定义一个i值和j值,分别表示从左边开始与flag比较的数组元素下标,从右边开始与flag比较的数组元素下标,这里需要注意的是,若选择数组中左起第一个元素为flag,则先从右开始与flag比较,反之亦然。当下标j 和下标i的元素相同的情况下,停止此次排序,用flag与当前下标i(下标i和下标j相等)的元素进行交换,就能满足左边小于flag的值,右边大于flag的值。然后以左边的元素构成一个数组,依旧选择左起第一个元素为flag,同时下标i为左起第一个元素的下标,下标j为数组的右侧最后一个元素的下标,开始比较排序,类似之前的操作。下面举例说明。
23,54,6,34,55,12,4,67,8,29
上面的数组中,选择左起第一个元素 23作为flag,定义i和j作为下标,分别指向最左边和最右边,即i指向23,j指向29,现在进行第一轮排序,要求左边的元素小于等于23,右边的元素大于等于23。29大于23,满足要求,j–,此时j指向元素8,8<23不满足右边的元素大于flag,停止右边的移动比较,开始比较左边i下标的元素,23等于23,满足条件,开始下一位54,54>23,不满足条件,这时交换54与8的值,交换后数组元素的值为:
23,8,6,34,55,12,4,67,54,29
接下来进行第二次排序。此时经过上一次的排序后,下标i处的元素是8,下标j处的元素为54,接着j–,j处的元素为67,67>23满足条件,j–,下标j处的元素为4,4<23不满足条件,停止右侧的比较,开始左侧的比较,左侧下标i处的元素为8,满足条件,i++,下标i处的元素为6,6<23满足条件,i++,下标i处的元素为34,34>23不满足条件,交换下标i处是元素34与下标j处的元素4,交换后数组的元素为:
23,8,6,4,55,12,34,67,54,29
接着比较右边j下标处的元素,34>23满足条件,j–,下标j处的元素为12,12<23不满足条件,左边下标i处的元素为4,4<23满足条件,i++,下标i处的元素为55,55>23不满足条件,交换下标i处的元素55与下标j处的元素12,交换后数组的元素为:
23,8,6,4,12,55,34,67,54,29
接着比较右侧下标j处的元素55,55>23满足条件,j–,下标j处的元素为12,12<23不满足条件,停止右侧下标j的元素比较,此时左侧的元素下标i 和右侧的元素下标j都为同一个元素的下标,这时用flag与下标为i的元素进行交换,交换后元素的值为:
12,8,6,4,23,55,34,67,54,29
这样完成了第一轮排序,实现了23左侧比23小,右侧比23大。下面以23左侧的元素构成一个数组:
”12,8,6,4“
依旧选取12为flag,下标i处的元素为12,下标j处的元素为4,从右侧开始比较,4<12,不满足条件,停止下标j处的元素比较,开始下标i处的元素比较,12=12满足条件,i++,下标i处的元素为8,8 <12满足条件,i++,下标i处的元素为6,6<!2满足条件,i++,下标i处的元素为4,此时下标i处的元素和下标j处的元素是同一个元素,停止下标i的比较,用flag与下标i处的元素4交换位置,交换后的数组:
”4,8,6,12“
此时12以左的元素小于12,这时以12以左的元素构成一个数组,
”4,8,6“
左起第一个元素4为flag,下标i处的元素为4,下标j处的元素为6,开始右侧的元素比较,6 >4满足条件,j–,下标j处的元素为8,8>4满足条件,j–,下标j处的元素为4,此时下标i处的元素和下标j处的元素相等,交换flag与下标i处的元素,flag和下标i处的元素为同一个元素,此时,4右侧的元素比4大,以右侧的元素组成一个数组,
”8,6“
同理,flag为8,下标i处的元素为8,下标j处的元素为6,开始右侧的比较,6<8不满足条件,开始左侧的比较,下标i处的元素为8,8==8满足条件,i++,下标i处的元素为6,此时下标i和下标j为同一个元素的下标,交换flag和下标i的元素,交换后数组:
“6,8”
8左侧比8小,此时在最开始以第一个元素23为标志得到的左侧的数组为:
”4,6,8,12“
23右侧的数组:
”55,34,67,54,29*
同理以第一个元素55为flag,下标i处的元素为55,下标j处的元素为29,开始右侧的比较,29<55不满足条件,开始左侧的比较,下标i处的元素55,55等于55,i++,下标i处的元素为34,34<55满足条件,i++,下标i处的元素为67,67>55不满足条件,交换下标i和下标j处的元素,得到数组:
“55,34,29,54,67”
此时下标j处的元素为67,67 >55,满足条件,j–,下标j处的元素为54,54<55不满足条件,下标i处的元素为29,29<55满足条件,i++,下标i处的坐标为54,下标i和下标j处的元素为同一个元素,交换flag与下标i处的元素得到数组:
“54,34,29,55,67”
这时55右侧比55大,左侧元素比55小,以左侧元素构成数组:
“54,34,29”
第一个元素54为flag,下标i为54的下标,下标j为数组的右侧最后一个元素的下标,开始右侧的比较,下标j处的元素29<54不满足条件,下标i处的元素54等于54,i++,下标i处的元素为34,34<54满足条件,i++,下标i处的元素为29,下标i处的元素与下标j处的元素为同一个元素,交换小标i处的元素与flag得到:
“29,34,54”
54左侧的元素比54小,以54左侧的元素构成一个数组得到:
“29,34”
同样flag为第一个元素,下标i为29的下标,下标j为右侧最后一个元素34的下标,开始比较右侧,34>29满足条件,j–,下标j处的元素为29,此时下标i和下标j处的元素为同一个元素,交换flag与下标i处的元素,排序后
“29,34”
此时55左侧的元素顺序为:
“29,34,54”
55右侧只有一个元素67,整个数组的排序已经排完,完整的顺序为:
“4,6,8,12,23,29,34,54,55,67”
整个实现的比较就是上面所说。

实现

#include <QCoreApplication>
#include <stdio.h>#if 0
void my_print(char text[])
{printf(">>>my_print()=%d\n",sizeof(text));
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);char test[]="Welcome to China";my_print(test);printf(">>>main()=%d",sizeof(test));return 0;
}
#endif#if 0
#include <QVector>
#include <QString>
#include <QDebug>
using namespace std;struct Grade
{string name;int grade;
};int main()
{Grade subject[3] = {{ "English", 80 },{ "Biology", 70 },{ "History", 90 }};int sum = accumulate(subject, subject + 3, 0, [](int a, Grade b){return a + b.grade; });string strObject = accumulate(subject,subject+3,string(" "),[](string str1,Grade str2){return str1+str2.name;});//accumulate如果是字符串求和,第三个参数必须是string(" ")qDebug() << sum<<"strObject="<<strObject.data()/*.c_str()*/;//240system("pause");return 0;
}
#endif#include <iostream>
using namespace std;void outputArr(int *arr,int count){for (int i = 0; i < count; ++i) {cout<<arr[i]<<" ";}
}//快速排序
void quickSort(int *arr,int left,int right){//left-下标起始值,小标结束值if (left >= right) {return ;}int flag = arr[left];int i = left;int j = right;int temp;while (i < j) {while (i < j && arr[j] >= flag) {//不能排除相等的情况,否则不适用于含有重复元素--j;}while (i < j && arr[i] <= flag) {++i;}if (i < j) {temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}if (arr[i] == arr[j]) {//一轮比较结束后,i和j相等temp = arr[i];arr[i] =  arr[left];arr[left] = temp;}quickSort(arr,left,i-1);quickSort(arr,i+1,right);
}int main()
{int nums[] = {23,1,34,4,6,78,33,9,5};quickSort(nums,0,6);//传入下标的范围outputArr(nums,9);cout<<endl;cout<<"==========================="<<endl;int nums1[] = {7,1,34,4,6,8,33,9,43,6};quickSort(nums1,0,9);outputArr(nums1,10);cout<<endl;return 0;
}

以上便是实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019 年 Q1 全球云基础设施市场份额揭晓,AWS继续领跑市场;Mesos官方回应Twitter“抛弃”Mesos……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;重磅先知 2019 年 Q1 全球云基础设施市场份额揭晓Mesos官方回应Twitter“抛弃”Mesos国内唯一&#xff0c;阿里云论文连续两年入选国际数据库顶级会议SIGMOD甲骨文中国研发中心大裁员&#xff1a;离职赔偿N6重磅快报2019 年 Q1 全球…

springboot启动报错LoggerFactory is not a Logback LoggerContext but Logback...

由于springboot默认日志组件为logback&#xff0c;当时项目使用的为log4j&#xff0c;在打war包到tomcat启动时报如上错误。 原因&#xff1a;log4j日志组件和自带logback日志组件冲突。 解决方法: 将默认日志组件排除。 <dependency><groupId>org.springframew…

postman使用过程中body中的form-data,x-www-form-urlencoded,raw,binary的简单记录

引言 初次使用postman不是很清楚怎么使用&#xff0c;就直接上手&#xff0c;不想看postman的使用文档&#xff0c;故而采用直接上手实验的方式&#xff0c;下面记录一下&#xff0c;body在使用的时候的四种类型。 类型说明 form-data&#xff1a;既可以上传键值对&#xff…

微电台│Get产品信息管理指南,和客户谈一场全渠道恋爱!

戳蓝字“CSDN云计算”关注我们哦&#xff01;▷ Informatica微电台004期 ◁楼下小谭撩数据&#xff08;隔壁的老王已经回到隔壁啦~&#xff09;如何使用产品信息管理与客户谈一场全渠道的恋爱&#xff1f;▼莫文蔚的阴天&#xff0c;孙燕姿的雨天&#xff0c;周杰伦的晴天都不如…

java.lang.ClassNotFoundException: org.apache.log4j.Logger

<!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

qt中使用QStringLiteral宏来实现带参数的输出

叙述 在QStringLiteral宏中输入字符串&#xff0c;但是字符串中有些值想用变量来输出&#xff0c;直接上代码&#xff1a; qDebug()<<QStringLiteral("已经重连%1次未果&#xff0c;请尝试关闭程序&#xff0c;重新启动后连接&#xff01;").arg(m_reconnect…

Error: GlobalConfigUtils setMetaData Fail

有疑问&#xff0c;请留言&#xff0c;看到后统一回复,谢谢配合&#xff01; 问题现象: Caused by: com.baomidou.mybatisplus.exceptions.MybatisPlusException: Error: GlobalConfigUtils setMetaData Fail ! Cause:java.sql.SQLException: The connection property ‘zeroDa…

漫话:如何给女朋友解释灭霸的指响并不是真随机消灭半数宇宙人口的?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;周末&#xff0c;陪女朋友去电影院看了《复仇者联盟4&#xff1a;终局之战》&#xff…

qt中生成并读取配置文件Ini

引言 做项目的时候需要将一些参数设置的更加灵活&#xff0c;通过用户修改来控制程序中一些参数&#xff0c;所以写到了配置文件中方便处理。 实现 下面是配置文件生成、读取的代码。 configinfo.h #ifndef CONFIGINFO_H #define CONFIGINFO_H#include <QMutex> #inc…

plsql常用快捷键

路径&#xff1a; D:\software\PLSQL Developer\PlugIns\shortcuts.txtplsql使用技巧 1、类SQL PLUS窗口:File->New->Command Window&#xff0c;这个类似于oracle的客户端工具sql plus&#xff0c;但比它好用多了。 2、设置关键字自动大写:Tools->Preferences->…

数据库不适合上容器云?| 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;Docker 在企业环境的应用端具有很大的潜力&#xff0c;在这一点上我想大家是有目共睹的…

【Git】fatal: bad boolean config value ‘true~‘ for ‘core.longpaths‘

windwos操作系统git config设置错了参数值&#xff0c;解决方法。 出现原因 在拉取代码时&#xff0c;仓库中存在文件名过长得文件&#xff0c;拉取报错了“filename too long” 解决 git config --system core.longpaths true结果在复制命令时&#xff0c;粘贴到命令行多了一…

qt设置渐变色

概述 此文只作为设置渐变色的一种方式&#xff1a; QDialog#ImDialog{background-color: qlineargradient(x1:0,y1:0,x2:1,y2:1,stop:0 #0e1d2e, stop:1 #141824); }以上为上下、左右渐变。 参考&#xff1a; https://blog.csdn.net/weixin_34034670/article/details/9182692…

linux 查看目录下文件个数

统计某文件夹下文件的个数 ls -l |grep "^-"|wc -l统计某文件夹下目录的个数 ls -l |grep "^&#xff44;"|wc -l统计文件夹下文件的个数&#xff0c;包括子文件夹里的 ls -lR|grep "^-"|wc -l

【数据分析】盘点五一期间最受欢迎的几个景区

戳蓝字“CSDN云计算”关注我们哦&#xff01;五一假期已经结束&#xff0c;小伙伴是不是都还没有玩过瘾&#xff1f;但是没办法&#xff0c;还有很多bug等着我们去写&#xff0c;同样还有需要money需要我们去赚。为了生活总的拼搏。今年五一放了四天假&#xff0c;很多人不再只…

SonarQube代码质量管理平台C++插件sonar-cxx的安装

gblfy推荐了一个好的可替代CFamily插件&#xff0c; sonar-cxx插件&#xff0c;听闻插件作者就是看不惯CFamily的收费&#xff0c;自己写了个开源的&#xff0c; 更牛逼的插件&#xff0c;开源地址 https://github.com/SonarOpenCommunity/sonar-cxx这是我使用插件后的图片&am…

qt提升控件之后,编译报错

引言 自定义的控件&#xff0c;在ui文件中将控件提升为自定义的控件&#xff0c;提升的时候没有指明提升的头文件的相对路径或者绝对路径&#xff0c;导致编译的时候无法找到相应的头文件。 解决方法 1.在被提升的类的头文件前添加本机电脑所在的相对路径&#xff1b; 2.在被…

Spark精华问答 | 学Spark究竟有什么用?

戳蓝字“CSDN云计算”关注我们哦&#xff01;为什么要学习Spark&#xff1f;作为一个用来实现快速而通用的集群计算的平台。扩展广泛使用的MapReduce计算模型&#xff0c;而且高效地支持更多的计算模式&#xff0c;包括交互式查询和流处理。Spark的一个重要特点就是能够在内存中…

SecureCRT 设置护眼最佳方案 的字体及颜色

SecureCRT远程连接Linux服务器 文章目录1. 选择全局选项2. 选择默认会话-【编辑默认设置】3. 选择仿真-【终端选择Linux】4. 选择外观-【当前颜色方案&#xff08;白/黑&#xff09;】 -【字符编码】5. 字体修改-点击字体6. 选择字体及大小7. 关闭重启SecureCRT8. 效果图&#…

qt中QTreeWidget控件的使用

引言 在按照项目设计的样式来实现的时候&#xff0c;发现了一些问题&#xff0c;幸运的是最终找到了解决的方法。 详情 1.QTreeWidget设置列数和隐藏头&#xff08;这里指的是有1所在的那个部位&#xff09; ui->treeWidget->setColumnCount(1);//设置有1列ui->tr…