【算法基础】快速排序

news/2023/6/8 0:29:16

目录

一、快速排序核心思想

二、快速排序步骤

                (1)暴力做法

                (2)双指针做法

三、代码模板

四、边界问题

五、总结


一、快速排序核心思想

分治,即将一个序列划分成左部分小于等于x,右部分大于等于x

二、快速排序步骤

 

确定一个分界点x。分界点可以是左端 a[l]、右端a[r]、中间值a[(l+r) / 2]、以及随机取值。

调整区间。将数组一分为二,使≤x在左边,≥x在右边。【重点】

递归处理左右两个部分。

 Q:如何将数组一分为二,使≤x在左边,≥x在右边呢?

(1)、暴力做法:

1> 开辟两个数组从c[ ]、b[ ]。

2>将原数组a[ ]中把≤x的元素放在c[ ]中,≥x放在b[ ]中。

3>最后将c[ ] 放入 a[ ],c[ ]放入a[ ]。

(2)、双指针做法(推荐)

 

首先先让指针 i++ 向中间寻找元素,直到指向的元素 ≥x 停下

同样地,再将指针 j - -向中间寻找元素,直到指向的元素 ≤x 停下

当条件满足 i < j,就将这两个元素交换

最终指针 j 就一定会在指针 i 的前面 


举个例子,如下图所示

三、代码模板

void quick_sort(int a[],int l,int r)
{if(l >= r) return; //如果数组中就一个数,就已经排好了(递归出口) int x = a[(l + r) / 2]; //确定分界点int i = l - 1,j = r + 1;while (i < j){do i++; while(a[i] < x);do j--; while(a[j] > x);if (i < j) swap(a[i],a[j]);}//递归处理左部分quick_sort(a,l,j);//递归处理右部分quick_sort(a,j + 1,r);
}

四、边界问题

①为什么要使用 do while循环而while循环

while(a[i] < x) i++;
while(a[i] > x) j--;

如图所示,假设数组中有相同的元素,会死循环

 

②为什么移动移动 i 和 j的条件分别是 < x 和 > x,而不是一开始所说的 <= x 和 >= x

如果分界点x,恰好是数组中最大值,会导致 i++ 越界。

同理,如果分界点又恰好是数组中最小值,也会导致 j -- 越界。

 ③当x=a[l]

递归部分就不能使用quick_sort(a,l,i - 1)、quick_sort(a,i,r)

假设数组只有1和2在排序时,假设分界点x = 1,因此 到时候 i 和 j 会同时指向1,对于第一个递归quick_sort(a,0,- 1),相当于没有值,也就没有交换,但到了第二个递归quick_sort(a,0,2),就一直就这两个数交换,导致了死递归

④当x = a[r]

递归部分就不能使用quick_sort(a,l,j)、quick_sort(a,j + 1,r)

例子和①一样

⑤当x=a[(l + r) /2]

同样的道理,假设数组中只有2个元素分别是1和2,这时,分界点x = 1,这种情况和③类似,就不能使用quick_sort(a,l,i - 1)、quick_sort(a,i,r)

⑥当x=a[(l + r + 1) / 2]

递归部分就不能使用quick_sort(a,l,j)、quick_sort(a,j + 1,r)

 五、总结


(1)当x=a[l] 或者 x=a[(l + r) /2],只能用

quick_sort(a, l, j); //左半部分递归
quick_sort(a,j + 1, r); //右半部分递归

(2)当x=q[r] or x=q[l+r + 1>>1],只能用

quick_sort(a,l,i - 1);//左半部分递归
quick_sort(a, i, r);//右半部分递归

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

27部优秀的黑客纪录片

在多数人眼中&#xff0c;黑客通常是一群无聊至极没有什么趣味的人&#xff0c;在他们的世界里仿佛只有计算机和那敲不完的代码。但事实真的如此吗&#xff1f;让我们回味一下看《黑客帝国》、《幽灵》等黑客题材电影时的场景。有木有种热血澎湃&#xff0c;瞬间变成小迷妹的冲…

《Ajax实战》三部曲之“王者归来”

rel"File-List" href"file:///C:%5CWindows%5CTEMP%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> rel"Preview" href"file:///C:%5CWindows%5CTEMP%5Cmsohtmlclip1%5C01%5Cclip_preview.wmf">rel"themeData" href&quo

0910期即将上市:优秀产品三部曲

本期封面报道&#xff1a; 优秀产品三部曲 一 个优秀的产品&#xff0c;完全有可能决定一家公司的兴衰成败。然而如何才能诞生一个优秀的产品&#xff1f;一般来说&#xff0c;都要经历产品规划和设计开发、产品营销、产品运营三个阶 段。在互联网大行其道的今天&#xff0…

财务费控--企业信息化三部曲(财务方向)

话不多说&#xff0c;这篇文章直接贴上干货&#xff01; 财务信息化建设的“三步走”是指&#xff1a;从无到有、连接协作、融合共享&#xff0c;大白话是&#xff1a;将线下基础工作搬上线、部门间/上下级公司业务协作、集团数据大融合。企业信息化建设是任重道远的、是循环渐…

【GNSS技术发展三部曲】

在我们了解一个新的技术领域的时候&#xff0c;最令人头疼的往往是其技术名词缩写的含义与各自关系&#xff0c;这常常会让新手或业外人士丈二摸不着头脑。今天小新就给大家讲讲卫星导航技术领域的三部曲&#xff1a;RTK&#xff0c;PPP&#xff0c;LEO。 GPS是全球发展最早的全…

概述.runoob.html

<!DOCTYPE html> 声明为 HTML5 文档<html> 元素是 HTML 页面的根元素<head> 元素包含了文档的元&#xff08;meta&#xff09;数据&#xff0c;如 <meta charset"utf-8"> 定义网页编码格式为 utf-8。<title> 元素描述了文档的标题<…

QT中添加opengl窗口时,出现:error: undefined reference to `__imp__ZN13QOpenGLWidgetC1EP7QWidget6QFlagsIN2Qt10W

完整错误&#xff1a; error: undefined reference to __imp__ZN13QOpenGLWidgetC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE 如图&#xff1a; 在.pro文件开头添加&#xff0c; QT openglwidgets即可

QWindowsWindow::setGeometryDp: Unable to set geometry问题

总结原因&#xff1a; 由于子窗口和父窗口的大小关系不健康&#xff0c;导致父窗口resize失败&#xff0c;失败后会自定义大小 解决方法&#xff1a; 首先&#xff0c;修改父窗口尺寸&#xff0c;保证其大小可以容纳子部件&#xff0c;可以使用setFixSize()之类的函数修改父窗…