排序算法 - 快速排序

news/2024/10/19 8:43:36

排序算法 - 快速排序

   概要

   快速排序(Quicksort)是对冒泡排序算法的一种改进。快速排序是一种基于分而治之的排序算法。

   它的基本思想是: 选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

   基准元素的选择,以及元素的交换,都是快速排序的核心问题。    

   一、基准元素的选择

   最简单的方式是选择第1个元素。但是针对特殊情况比如原本逆序的数列,期望排列成顺序数列,整个数列并没有被分成两半。如何避免这种情况?

   解决办法:随机选择一个基准元素,并且让基准元素和数列首元素交换位置。

   二、元素的交换

   选定了基准元素以后,我们要做的就是把其他元素中小于基准元素的都交换到基准元素一边,大于基准元素的都交换到基准元素的另一边。具体实现有两种方法。

   1. 双边循环法

   选定基准元素pivot,并且设置两个指针left和right,指向数列的最左和最右两个元素。

   接下来进行第1次循环,从right指针开始,让指针所指向的元素和基准元素做比较,如果大于pivot,则指针向左移动。如果小于pivot,则right指针停止移动,切换到left指针。

   轮到left指针,让指针所指向的元素和基准元素做比较,如果小于等于pivot,则指针向右移动。如果大于pivot,则left指针停止移动。

   让left和right指针所指向的元素进行交换。

   接下来进入第2次循环,重新切换到right指针,向左移动。按照这个思路继续往下,

   最后,等到left指针和right指针重合的时候,将left指针所指向的元素和基准元素所在位置的元素进行交换。返回left指针所在的位置,这个就是基准元素的位置,根据基准元素,分成两部分递归排序。

   2. 单边循环法

    双边循环法从数组两边交替遍历元素,虽然更加直观,但是代码实现相对繁琐,而单边循环法则简单得多,只从数组的一边对元素进行遍历和交换。

    mark指针代表小于基准元素的区域边界。
    具体实现过程:

    从基准元素的下一个位置开始遍历数组。

    如果遍历到的元素值大于等于基准元素时,就继续往后遍历

    如果遍历到的元素小于基准元素值时,则需要做两件事:

    1)将mark指针右移1位,因为小于pivot的区域边界增大

    2)让最新遍历到的元素和mark指针所在位置的元素交换位置,因为最新遍历的元素归属于小于pivot的区域。

    最后,将pivot元素交换到mark指针所在位置,返回mark指针所在的位置,这个就是基准元素的位置,根据基准元素,分成两部分递归排序。这一轮宣告结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

学习groovy基础

简介 Groovy 是一种 JVM 语言,它可以编译与 Java 相同的字节码,然后将字节码文件交给 JVM 去执行,并且可以与 Java 无缝地互操作,Groovy 可以透明地与 Java 库和代码交互,可以使用 Java 所有的库。 Groovy 也可以直接将源文件解释执行 它还极大地清理了 Java 中许多冗长的…

高级语言程序设计第三次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13284 学号:102400127 姓名:王子涵 4.8q2 打印引号的时候一开始忘了 然后在写d小题的时候宽度不知道怎么处理 后来询问了同学解决…

计量经济学(十)——正态性检验(Normality Test)

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 正态性检验(Normality Test)是一种用于判断数据是否服从正态分布的重要统计方法,广泛应用于时间序列分析、回归分析等模型的构建与诊断中。许多统计模型,…

Response web登录操作 -2024/10/17

响应行设置响应状态码: void setStatus(int sc);设置响应头键值对: void setHeader(String name,String value);response实现重定向resp.setStatus(302);resp.setHeader("location","https://www.4399.com");前端a.html登录,将结果传给后端,用request接收…

Kail从入门到入狱第二课:mkdir、touch、vim、cat命令的基本应用

如果是日常生活,请不要使用root,因为root可以做任何事情比如"格式C盘" 创建目录:mkdir 很简单,在当前工作目录创建一个目录,如图所示测试:请说出cd /test的含义 今天我们将使用图形界面,请打开命令行创建文件:touch touch filename可以看到成功创建 文本编辑…

地平线与英伟达工具链 PTQ 工具功能参数对比与实操

1.理论简介在阅读本文之前,希望大家对 PTQ(Post-Training Quantization) 训练后量化有一定的了解~地平线 OpenExplorer 和 NVIDIA TensorRT 是两家公司为适配自己的硬件而开发的算法工具链,它们各自具有独特的特点和优势。分开看的时候,网上有很多资料,但却没找到将他们…

公网Linux环境搭建frp实现内网穿透

前提: 本实验为一台ubuntu22操作系统云主机 脚本适用于安装平台:CentOS、Debian、Ubuntu FRP项目地址:https://github.com/fatedier/frp FRP一键脚本地址:https://github.com/MvsCode/frps-onekey1、FRP服务器端一键安装脚本(脚本在本文最后有,如果在服务器上无法获取到下…

码城|计算机专业的00后转行数据分析,还有机会吗?【悟空非空也】

计算机背景学习数据分析是有优势的。数据分析需要一些技术基础,简单点的话,需要会使用 Excel ,复杂点会用 Python 进行数据挖掘和数据分析 ,当然SQL语句一定要会,自己多练习。如果再懂点深度学习,那就更加厉害啦。 有计算机底子,学习 Python 新语言应该也没有什么问题,…