死磕算法之快速排序

版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80851021


学习更多算法系列请参考文章:死磕算法之汇总篇


快速排序是一个运用了分治法和递归算法的排序方式。

假如我们现在要排序的数组为[3,1,0,2,8,4,2]。那么在进行快速排序的时候我们先要进行一些准备:

  • n作为一个数组中的标杆,一趟排序过后我们要把数组中所有大于n的数放在它的右边,所有小于n的放在它的左边。一般情况下我们会取数组第一个元素作为n,在此数组中就是n=3
  • i我们使用i来找数组中大于标杆的值,i初始指向数组第一个位置
  • j我们使用j来找数组中小于标杆的值,j初始指向数组最后一个位置

下面开始排序:

  1. 先从数组右边开始,我们发现j指向的元素2比标杆n小,那么我们将j指向的元素赋值给i指向的元素,停止操作。此时数组为[2,1,0,2,8,4,2],i指向第一个位置,j仍指向最后一个。
  2. 从数组左边开始,i指向的元素2比标杆小,所以不做操作,使i++,i指向的元素1比标杆小,所以不做操作,使i++,一直到i指向8的时候比标杆大(注意此处如果等于的话也要操作),那么就把i指向的元素赋值给j指向的元素,此时数组为[2,1,0,2,8,4,8],i指向第五个位置。也就是元素8,j仍然指向最后一个位置。
  3. 继续从右边操作,j指向的8不比n小,所以不做操作,j--,4不比3小,不做操作,j--。现在i和j的位置重合了,把n放到这个位置上。我们此轮的操作也就结束了,接下来我们把3所在的位置左边分为一个数组,右边位置分为一个数组再次进行刚才的操作。(此处就是一个递归调用了)

接下来就来看一个图片描述的过程





接下来上代码

public static void quickSort(int[] a, int l, int r) {if (l < r) {int i,j,n;
        i = l;j = r;n = a[i];while (i < j) {while(i < j ){if(a[j] < n){a[i] = a[j];
                    break;
                }j--;
            }while(i < j ){if(a[i] >= n){a[j] = a[i];break;
                }i++;}}a[i] = n;quickSort(a, l, i-1); /* 递归调用 */quickSort(a, i+1, r); /* 递归调用 */}
}

快速排序讲完了。在这里温馨提示大家,学习算法时,我们没必要拘泥于代码的实现,那没有意义。我的建议就是深入理解步骤,当你理解步骤以后代码是随你怎么玩都可以的。


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

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

相关文章

九点标定进行仿射变换halcon仿真代码

筛选出来的点得坐标已经显示在PxRow、PxColunm里边 * Image Acquisition 01: Code generated by Image Acquisition 01 read_image (Image, C:/Users/Administrator/Desktop/标定板图片.png) dev_close_window () dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHand…

用SQL语句添加删除修改字段_常用SQL

1.增加字段 alter table docdsp add dspcodechar(200)2.删除字段 ALTER TABLE table_NAME DROP COLUMNcolumn_NAME3.修改字段类型 ALTER TABLE table_name ALTER COLUMNcolumn_name new_data_type4.sp_rename 改名 EXEC sp_rename [dbo].[Table_1].[fi…

DAVINCI开发原理之三----达芬奇编解码引擎Codec Engine(CE)

DaVinci是DSP和ARM 双核架构的SOC芯片。对芯片与外界的交互通过ARM端的Montavista Linux和相关驱动与应用程序来管理&#xff0c; DSP端只处理编解码相关的算法。DSP和ARM之间的通讯和交互是通过引擎(Engine)和服务器(Server)来完成的。1. 编解码引擎(Codec Engine) a. 核心引…

Windows操作系统安全加固

本文档旨在指导系统管理人员或安全检查人员进行Windows操作系统的安全合规性检查和配置。 1. 账户管理和认证授权 1.1 账户 默认账户安全 禁用Guest账户。禁用或删除其他无用账户&#xff08;建议先禁用账户三个月&#xff0c;待确认没有问题后删除。&#xff09;操作步骤 打开…

ios修改了coredata数据结构后,更新安装会闪退

如果iOS App 使用到CoreData&#xff0c;并且在上一个版本上有数据库更新&#xff08;新增表、字段等操作&#xff09;&#xff0c;那在覆盖安装程序时就要进行CoreData数据库的迁移&#xff0c;具体操作如下&#xff1a; 1.选中你的mydata.xcdatamodeld文件&#xff0c;选择菜…

TI DAVINCI开发原理(总共5部分)

2011-06-03 11:14:17| 分类&#xff1a; TI 达芬奇视频处 | 标签&#xff1a; |字号大中小订阅 DAVINCI开发原理之一----ARM端开发环境的建立(DVEVM) 1. 对DAVINCI平台&#xff0c;TI在硬件上给予双核架构强有力的支撑&#xff0c;在DSP端用DSP/BIOS来支持音视频算法的运行…

数据库代码写法

1.创建数据库create database test2; 2.删除数据库drop database test2; 3.创建表 create table ceshi (ids int auto_increment primary key,uid varchar(20),name varchar(20),class varchar(20),foreign key (class) references class(code) ); create table class (code …

random库的使用

有关Python中random标准库的使用 Python中关于随机值的部分&#xff0c;借助的是根据当前的随机种子&#xff0c;通过梅森旋转算法&#xff0c;生成一段随机序列。 基本随机函数 random.seed(aNone)初始化给定的随机种子&#xff0c;默认值为当前的系统时间。 random.random()生…

ThinkPHP--栏目增删改查ADSF

<?php /*** 栏目发布*/ //V层&#xff0c;action/name值 action " :U( Admin/Cat/Cateadd )";/*** 添加栏目数据* C层&#xff0c;写相应的方法进行数据添加*/ public function add(){if(!IS_POST){$this->display();}else{//var_dump($_POST);$catModelD…

模拟查找晶元的位置

通过模板匹配找到所有模板位置&#xff0c;并且当单击某个模板时&#xff0c;选中某个模板 read_image (Image, C:/Users/22967/Desktop/晶圆找位置/0.bmp) dev_close_window () dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image)* draw_cir…

JavaScript常用函数之Eval()使用

eval() 功能&#xff1a;首先解释Javascript代码 然后执行它 用法&#xff1a;Eval&#xff08;codeString&#xff09; codeString是包含有javascript语句的字符串&#xff0c;在eval之后使用Javascript引擎编译。即&#xff1a;eval函数可以把一个字符串当作一个javascript表…

初探数位dp

前言&#xff1a;这是蒟蒻第一次写算法系列&#xff0c;请诸位大佬原谅文笔与排版。 一、导入 在刷题的时候&#xff0c;我们有时会见到这样一类问题&#xff1a;在区间$[l,r]$内&#xff0c;共有多少个整数满足某种条件。如果$l$和$r$间的差很小&#xff0c;我们可以考虑暴力枚…

Java演示手机发送短信验证码功能实现

我们这里采用阿里大于的短信API 第一步&#xff1a;登陆阿里大于&#xff0c;下载阿里大于的SDK a、在阿里大于上创建自己的应用 b、点击配置管理中的验证码&#xff0c;先添加签名&#xff0c;再配置短信模板 第二步&#xff1a;解压相关SDK&#xff0c;第一个为jar包&#xf…

使用标定板对相机位姿进行估计

使用标定板几个特定的点&#xff0c;来对相机相对标定板平面进行位姿估计。 首先进行相机的畸变校正&#xff0c;之后同个各个标定板间的圆点距离进行位姿估计。 gen_caltab (7, 7, 0.002, 0.5, C:/Users/22967/Desktop/新建文件夹/111.descr, C:/Users/22967/Desktop/新建文件…

音、视频文件格式

* 说明&#xff1a;首先要分清楚 媒体文件和编码的区别&#xff1a;文件是既包括视频又包括音频、甚至还带有脚本的一个集合&#xff0c;也可以叫容器&#xff1b;文件当中的视频和音频的压缩算法才是具体的编码。 *AVI音视频交互存储&#xff0c;最常见的音频视频容器。支持的…

ELK日志分析系统(转)

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://467754239.blog.51cto.com/4878013/1700828大纲&#xff1a; 一、简介 二、Logstash 三、Redis 四、Elasticsearch 五、Kinaba 一、简介 …

Glide使用总结

首先&#xff0c;添加依赖 implementation com.github.bumptech.glide:glide:4.5.0 annotationProcessor com.github.bumptech.glide:compiler:4.5.0之后添加访问网络权限 <uses-permission android:name"android.permission.INTERNET" />一、常用的方法 1、加…

流行的音频编码标准

speech codec (G.711, G.723, G.726, G.729, iLBC) 各种各样的编解码在各种领域得到广泛的应用&#xff0c;下面就把各种codec的压缩率进行一下比较&#xff0c;不正确之处望各位同行指正。 Speech codec&#xff1a; 现主要有的speech codec 有: G.711, G.723, G.726 , G…

【angularjs】使用angular搭建项目,pc端实现网页中的内容不可复制

实现目标&#xff1a;不可复制页面内容 js:          <script language"javascript"> if (typeof(document.onselectstart) ! "undefined") { // IE下禁止元素被选取 document.onselectstart function (event){if(event.targe…

DIV+CSS如何让文字垂直居中?

在说到这个问题的时候&#xff0c;也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗&#xff1f;即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊&#xff01;所以在这里我还要啰嗦两句&#xff0c;CSS中的确是有vertical-align属性&#xff0c;但是它…