对快速排序的理解以及相关c++代码
快速排序:在一组数据中,可以将左边的数字当作枢轴(右边也可以),接下来要做的就是,先从右边找到比枢轴小的数,
再从左边找到比枢轴大的数,接着将这两个数进行交换,重复上述步骤找出所有符合条件的数进行交换,
最后将枢轴放到比枢轴大的数与比枢轴小的数之间。之所以要从右边开始找,并且找到比枢轴小的数是因为交换后小的数就在枢轴的左边了。
下面举个比较特殊的例子希望能增加理解。
|
1 |
9 |
8 |
5 |
6 |
7 |
3 |
2 |
0 |
4 |
先从右往左找到比1小的第一个数字为0,此时的索引位置j=8,再从左往右找到比1大的第一个数字为9,此时的索引位置i=1,此时交换0和9,
|
1 |
0 |
8 |
5 |
6 |
7 |
3 |
2 |
9 |
4 |
继续下一次重复任务
先从右往左找到比1小的第一个数字为0,此时的索引位置,j=1,而从左往右找到比1大的第一个数字8此时的索引i=2,很明显i>j,这是不允许的,
所以这时候就可以让所选的枢轴1与j位置上的值交换(也就是把枢轴放到两组数字中间)
|
0 |
1 |
8 |
5 |
6 |
7 |
3 |
2 |
9 |
4 |
先看1左边的情况此时就一个数字1已经排好,
再看右边的情况,从j+1的位置开始到最后,且以j+1的位置为枢轴,
从右边找比8小的第一个数字为4,索引j=9,从左边找比8大的第一个数字为9,索引i=8,交换4和9
|
8 |
5 |
6 |
7 |
3 |
2 |
4 |
9 |
按照上述逻辑继续
|
9 |
5 |
6 |
7 |
3 |
2 |
8 |
9 |
8的左边
|
4 |
5 |
6 |
7 |
3 |
2 |
从右往左找比4小的数字,从左往右找比4大的数字,并交换
|
4 |
2 |
6 |
7 |
3 |
5 |
继续
|
4 |
2 |
3 |
7 |
6 |
5 |
继续
|
3 |
2 |
4 |
7 |
6 |
5 |
8的左边又被4分成两段
8的右边
|
9 |
4的左边
|
3 |
2 |
|
2 |
3 |
4的右边
|
7 |
6 |
5 |
这一次同样以左边为枢轴,从右边找到5,左边会一直找知道找到5所在的位置此时j=i
跳出循环直接把7与j的位置交换,让枢纽7将这3个数分开,实际上7的右边没有值了
只需考虑7的左边
|
5 |
6 |
7 |
所以最终就排好了
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
以下是c++带模版的快速排序代码
#include <iostream> using namespace std; template<class T>
void QuickSort(T *q, int left, int right); int main()
{
int a[]={,,,,,,,,,};
QuickSort(a, , );
for(int i=; i<; i++)
cout << a[i] << endl;
return ;
} template<class T>
void QuickSort(T *q, const int left, const int right)
{
if(left<right)
{
int i=left, j=right;
int temp = q[left];
while(i<j)
{
while(q[j]>=temp && i<j)
{
j--;
}
while(q[i]<=temp && i<j)
{
i++;
}
swap(q[i],q[j]);
}
swap(q[left], q[j]);
QuickSort(q, left, j-);
QuickSort(q, j+, right);
}
}
对快速排序的理解以及相关c++代码的更多相关文章
- 创建HttpFilter与理解多个Filter代码的执行顺序
1.自定义的HttpFilter,实现Filter接口 HttpFilter package com.aff.filter; import java.io.IOException; import ja ...
- 快速排序的理解和实现(Java)
快速排序介绍 快速排序(Quick Sort)使用分治法策略,其基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进 ...
- 关于Spring的理解和相关笔记
java不死的原因就是:就是因为他有一个核心非常强大的技术框架支持. Spring IOC: Inverse Of Control 控制反转 IFly fly; AOP: Aspect Oriente ...
- 深入理解xLua基于IL代码注入的热更新原理
目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题.另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一. 热更新可以 ...
- java中快速排序的理解以及实例
所谓的快速排序的思想就是,首先把数组的第一个数拿出来做为一个key,在前后分别设置一个i,j做为标识,然后拿这个key对这个数组从后面往前遍历,及j--,直到找到第一个小于这个key的那个数,然后交换 ...
- 我终于理解了LISP『代码即数据|数据即代码』的含义
以前我一直不能理解LISP里引用的作用,感觉引用和字符串没什么区别.比如:> (define (func) 'ok) > (func) 'ok 这里把引用ok当做了函数func的返 ...
- java 发送邮件 email相关操作代码测试,生成复杂格式邮件,发送邮件相关操作
项目源码下载:http://download.csdn.net/detail/liangrui1988/6720047 效果图: 相关代码: test1 package com.mail; impor ...
- [2017-08-16]ABP系列——QuickStartB:正确理解Abp解决方案的代码组织方式、分层和命名空间
本系列目录:Abp介绍和经验分享-目录 介绍ABP的文章,大多会提到ABP框架吸收了很多最佳实践,比如: 1.N层 (复用一下上篇的图) 展现层(Personball.Demo.Web):asp.ne ...
- java类的理解和相关问题
---java抽象类 当我们定义的对象无法抽象或者不适合抽象为一个具体的类的时候 我们通常定义其为一个抽象类 like 衣服 (多种衣服) 手机 (多种手机) ---接口和抽象类的异同 对于概念上来说 ...
随机推荐
- P1026 统计单词个数——substr
P1026 统计单词个数 string 基本操作: substr(x,y) x是起始位置,y是长度: 返回的是这一段字符串: 先预处理sum[i][j],表示以i开头,最多的单词数: 从后往前寻找,保 ...
- CentOS 7 常用命令大全(转)
博主最近疯狂迷恋上linux的centos 7 系统,特意从网上找了一篇centos 7的命令大全来学习,下面我分享下这个博客. 转载自:https://blog.csdn.net/o0darknes ...
- 微信小程序入门与实战 常用组件API开发技巧项目实战*全
第1章 什么是微信小程序? 第2章 小程序环境搭建与开发工具介绍 第3章 从一个简单的“欢迎“页面开始小程序之旅 第4章 第二个页面:新闻阅读列表 第5章 小程序的模板化与模块化 第6章 构建新闻详情 ...
- Java使用超级工具包Hutool操作数据库
#=================================================================== # pom.xml中添加引用 # <!-- https: ...
- 编程微语 2019-Summer
不支持重新生成不是好的代码生成器.重新生成就会覆盖手工修改,实用性大打折扣.相比工具,更接近玩具.2019-05-04 有很多个标准,各自为政,就相当于没有标准.目前地球的文档(如纯文本/Word/P ...
- 运行模型,COM错误,解决问题步骤
运行模型,COM错误,解决问题步骤 1.数据新建一个,路径短一点,不要有中文 2.所有数据重新导入 3.文档新建 4,问题莫名奇妙解决了
- Sentinel控制台前端开发环境搭建
Sentinel:分布式系统的流量防卫兵. 官网:https://sentinelguard.io Github:https://github.com/alibaba/sentinel Wiki:ht ...
- 数据库连接池配置(案例及排查指南) 原创: 有赞技术 有赞coder 4天前
数据库连接池配置(案例及排查指南) 原创: 有赞技术 有赞coder 4天前
- vue.js中如何使用scss
要使用 <style lang="sass"> 請記得要裝相依的套件 $ npm install sass-loader node-sass vue-style-loa ...
- markdown中如何设置字体为红色?
答: 语法如下: <font color='red'> text </font>