重温快速排序(r4笔记第73天)
说起排序,总是会想起大名鼎鼎的快速排序,等自己再次翻开快速排序时,感觉是很陌生的,从这个对比也能看出自己确实是已经忘记了曾经重要的日子。 快速排序使用了分治思想,分而治之。为了达到它传说中较低的时间度,接受了来自大家多年的挑战还依然是名副其实的快速排序。 一个简单的例子就是通过简单的实例来说明。 我们假设一组数字如下: 6,9,4,1,8,7,2,3,5 我们假设以第一个数为参考,即temp为6,两边的数分别为i,j,从这组数的两边来比较这个中间变量,不断的移动下标,从右边开始寻找比temp小的数,从左边开始和寻找比temp大的数。 在这个例子中就是以8为基本的参考,分别从这组数的右边,左边开始移动下标,寻找分别是小于6,大于6的节点。 需要经过这么几轮的比较。 第一轮,我们发现右边第一个节点5<6,就是它了,从左边开始,节点9>6,需要对这个两个节点进行对调。 6,9,4,1,8,7,2,3,5 变为 6,5,4,1,8,7,2,3,9 继续移动下标,从右边开始寻找小于6的,从左边开始寻找大于6的数,结果我们比较一番,发现数3<6,8>6 所以结果如下: 6,5,4,1,8,7,2,3,9 变为: 6,5,4,1,3,7,2,8,9 接下来继续移动下标,发现,2<6,7>6得到的结果如下: 6,5,4,1,3,7,2,8,9 变为: 6,5,4,1,3,2,7,8,9 这个时候从右,从左下标都没法再移动了,再移动就交叉了,这个时候就是需要对这组数进行划分了,划分的基本参考就是6 6,5,4,1,3,2,7,8,9 变为: 2,5,4,1,3,6,7,8,9 这个时候就分成了两组数2,5,4,1,3 和7,8,9两组数,然后根据分治思想需要对着两组数进行进一步的比较。 右边的3个数7,8,9已经是最后结果了,我们来看看左边的数,2,5,4,1,3 设定temp=2,然后下标继续从右,从左开始移动。 2,5,4,1,3 变为: 2,1,4,5,3 然后下标继续移动就移动不了了。继续拆分。 变为1,2, 4,5,3 继续比较,拆分得到最后的结果。 通过程序的实现如下:
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left]; //temp中就是基准数,取第一个数
i=left;
j=right;
while(i!=j)
{
//顺序很重要,要先从右边开始找
while(a[j]>=temp && i<j)
j--;
//再找左边的
while(a[i]<=temp && i<j)
i++;
//交换两个数在数组中的位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最后分拆,得到两组数,对基准书进行重新初始化
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);//处理左边的
quicksort(i+1,right);//处理右边的
}
- String中的null,以及String s;等区别详解
- Shell编程——Shell中的数学运算
- 如何利用微信监管你的TF训练?
- python 安装spark_Spark环境搭建 (Python)
- MongoDB触发oom-killer的简单处理(一)(r7笔记第54天)
- int与integer的区别
- java 自动装箱与拆箱
- python读取文件——python读取和保存mat文件
- python 利用递归实现全排列
- java中 == 与 equal 的区别
- python基础知识——字符串
- python 实现数据降维推荐系统(附Python源码)
- MYSQL数据导出与导入,secure_file_priv参数设置
- numpy 参数(一) —— np.linalg
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在genome browser中添加自己的注释文件
- 原理+代码|Python基于主成分分析的客户信贷评级实战
- Python办公自动化 | 从PPT到Word
- linux命令行参数getopts参数二选一
- 黎巴嫩首都爆炸能量有多大?物理学家看视频计算:300吨TNT!
- OracleDG 环境主备业务数据不同步备库报ORA-600错误的处理过程
- Xcode清理模拟器文件
- 【Android 音视频开发打怪升级:FFmpeg音视频编解码篇】六、FFmpeg简单合成MP4:视屏解封与重新封装
- 32.opengl高级光照-延迟着色法
- Tsunami:一款功能强大的通用网络安全扫描工具
- Hive查看表/分区更新时间
- 直接通过手机抓取GPS的qxdm日志
- uniapp常用提示框uni.showToast(OBJECT)
- MySQL 索引(3)
- TS 设计模式04 - 适配器模式