八大排序——快速排序

在这里插入图片描述
Hello,大家好,今天分享的八大排序里的快速排序,所谓快速排序是一个叫霍尔的人发明,有很多人可能会觉得为什么不叫霍尔排序,其中原因就是因为它快,快速则体现了它的特点,今天我们就来讲一下快速排序,现在开始我们的学习吧。

快速排序

1.基本思想
通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
实现逻辑

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

① 从数列中挑出一个元素,称为 “基准”(pivot),
② 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
③ 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

我们来看一下它的图是怎么实现的

在这里插入图片描述
首先我们给定它一个数组,并且定义左边为left,右边为right,然后我们的有个中间值,中间值这里我们就叫它为k,定义这个k是从left开始,当然我们也可以从right开始,等一下会来讲原因,现在我们只要看懂它的图就行
在这里插入图片描述
因为是从左边开始,所以要从右边先走,原因是我们这样才能确定left和right相遇的时候的值一定比k的值小,这里再详细展开讲解一下,我们的left和right相遇有两种可能,一种是left和right相遇,这个时候相遇是怎样的呢,因为right先走,遇到比k小的时候停下来,然后left又开始走,除非遇到比l大的值才会停下,否则就继续,但是我们还有一个结束条件那就是left要小于right,所以如果left没有找到比k大的值,他们就会相遇,那这样的话,因为我们right找到小的值了,所以最后k肯定比right所指向的值要大,还有一个就是我们right遇到left,那同样的道理,说明我们的right没有找到比k大的值,所以相遇之后也是一样的道理,结论就是相遇的值一定比k指向的值小。那我们再继续来看图

在这里插入图片描述
这个时候我们的right找到比k小的值,然后才开始动left,那我们现在开始动left

在这里插入图片描述
left也找到了,那现在就是交换它们的,这里我们用一个swap函数就可以了,因为后面还需要用到swap这个函数的,交换之后变成这样的
在这里插入图片描述
可以看到先在我们已经开始交换,我们找值需要一个两个while,外面还需要一个大while控制

那我们现在可以继续开始动right了
在这里插入图片描述
这下又找到了
开始动left

在这里插入图片描述
那现在我们需要交换他们
在这里插入图片描述
现在我们也交换好了,现在right在走一步就会爆炸(小编是小黑子,实锤了),这个时候循环就应该结束

在这里插入图片描述
我们需要做的就是在循环外面再进行k和left的交换

void swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
int PartSort(int* a,int left, int right)
{int k = left;while (left < right){while ( a[right] > a[k]){right--;}while ( a[left] < a[k]){left++;}swap(&a[left], &a[right]);}swap(&a[left], &a[k]);return left;
}

这里其实会有问题,有两个问题,一个是会存在越界,一个就是会出现死循环,先讲一下死循环的例子,比如我们再第一次找left和right的值,这两个值的大小是相等的,那他们进行交换之后,left和right的值就不会变了,因为循环他们进不去了,所以要加一个等于的条件就行了,还有就是越界,我们之前讲过越界就像查酒驾一样,是有随机性的,为什么会越界,是因为right可能一直找不到小的值,然后就会比left还小,所以我们只需要加上一个条件就行了
看看代码

void swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
int PartSort(int* a,int left, int right)
{int k = left;while (left < right){while (left < right && a[right] >= a[k]){right--;}while (left < right && a[left] <= a[k]){left++;}swap(&a[left], &a[right]);}swap(&a[left], &a[k]);return left;
}

现在就是这只是我们走了一遍并不能实现将他们变成有序数列,所以这里我们就可以用递归进行遍历,怎么进行遍历,为什么能进行遍历呢,我们来分析

在这里插入图片描述
会这样分成左边和右边,然后再左边和右边再进行我们上面的操作,那是不是和二叉树很 相似的,所以我们递归实现一下,这里不过多的讲解,等我更新二叉树的文章后,大家可能看起来就明白了

void QuickSort(int* a, int begin,int end)
{	if (begin >= end)return;int ret = PartSort(a, begin, end);QuickSort(a, begin, ret - 1);QuickSort(a, ret + 1, end);
}

完整代码加测试代码

void swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
int PartSort(int* a,int left, int right)
{int k = left;while (left < right){while (left < right && a[right] >= a[k]){right--;}while (left < right && a[left] <= a[k]){left++;}swap(&a[left], &a[right]);}swap(&a[left], &a[k]);return left;
}void QuickSort(int* a, int begin,int end)
{	if (begin >= end)return;int ret = PartSort(a, begin, end);QuickSort(a, begin, ret - 1);QuickSort(a, ret + 1, end);
}#include<stdio.h>
int main()
{int arr[] = { 6,1,2,7,9,3,4,10,8 };QuickSort(arr, 0, sizeof(arr) / sizeof(int) - 1);for (int i = 0; i < sizeof(arr) / sizeof(int); i++){printf("%d ", arr[i]);}return 0;
}

在这里插入图片描述
反正最后排序成功了,这个挡住了一部分结果,我换个大的
在这里插入图片描述
好好好,今天的学习就到这吧,拜拜。。。。

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

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

相关文章

YOLOV7改进-具有隐式知识学习的Efficient解耦头

[解耦头][https://github.com/z1069614715/objectdetection_script/blob/master/yolo-improve/yolov7-DecoupledHead.py] 1、复制这些到yolo.py 2、到这 3、复制下半部分到yolo.py 4、替换这里 5、最后的加到上面的这里 6、添加 7、添加 8、V5大概一个点的提升 9、解…

OpenLdap +PhpLdapAdmin + Grafana docker-compose部署安装

目录 一、OpenLdap介绍 二、PhpLdapAdmin介绍 三、使用docker-compose进行安装 1. docker-compose.yml 2. grafana配置文件 3. provisioning 四、安装openldap、phpldapadmin、grafana 五、配置OpenLDAP 1. 登陆PhpLdapAdmin web管理 2. 需要注意的细节 内容介绍参考…

【GO语言基础】控制流

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 【GO语言基础】控制流 文章目录 系列文章目录条件语句if-else 结构判断一个字符串是否为空&#xff1a;switch结构 循环结构for 循环&#xff08;C风格&#xff…

ref 操作 React 定时器

秒表 需要将 interval ID 保存在 ref 中&#xff0c;以便在需要时能够清除计时器。 import { useRef, useState } from "react";const SecondWatch () > {const [startTime, setStartTime] useState<any>(null);const [now, setNow] useState<any>…

Vue+elementUI 导出word打印

import JSZipUtils from "jszip-utils"; import JSZip from "pizzip"; import Docxtemplater from "docxtemplater"; npm安装以上依赖 首先维护个word模板 导出方法 //导出wordskipOutWord(row) {var printData rowconst data JSON.parse(JS…

FFmpeg报错:Connection to tcp://XXX?timeout=XXX failed: Connection timed out

一、现象 通过FFmpeg&#xff08;FFmpeg的版本是5.0.3&#xff09;拉摄像机的rtsp流获取音视频数据&#xff0c;执行命令&#xff1a; ./ffmpeg -timeout 3000000 -i "rtsp://172.16.17.156/stream/video5" 报错&#xff1a;Connection to tcp://XXX?timeoutXXX …

PaddleOCR学习笔记1-初步尝试

尝试使用PaddleOCR方法&#xff0c;如何使用自定义的模型方法&#xff0c;参数怎么配置&#xff0c;图片识别尝试简单提高识别率方法。 目前仅仅只是初步学习下如何使用PaddleOCR的方法。 一&#xff0c;测试识别图片&#xff1a; 1.png : 正确文本内容为“哲学可以帮助辩别现…

【关于Java:认识异常】

文章目录 一、1. 异常概念与体系结构1.1 异常的概念1.2 常见的异常1.算数异常2.数组越界异常3.空指针异常 1.3 异常的体系结构1.4 异常的分类1. 编译时异常2. 运行时异常&#xff08;RuntimeException&#xff09; 二、 异常的处理方式2.1 防御式编程2.2 EAFP:&#xff08;异常…

【分类】分类性能评价

评价指标 1、准确率、召回率、精确率、F-度量、ROC ​ 属于各类的样本的并不是均一分布&#xff0c;甚至其出现概率相差很多个数量级&#xff0c;这种分类问题称为不平衡类问题。在不平衡类问题中&#xff0c;准确率并没有多大意义&#xff0c;我们需要一些别的指标。 ​ 通…

pyspark 系统找不到指定的路径; \Java\jdk1.8.0_172\bin\java

使用用具PyCharm 2023.2.1 1&#xff1a;pyspark 系统找不到指定的路径&#xff0c; Java not found and JAVA_HOME environment variable is not set. Install Java and set JAVA_HOME to point to the Java installation directory. 解决方法&#xff1a;配置正确环境变量…

万字C语言之分支语句和循环语句

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的小七&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c;数据结构和算法…

react-native实现 TextInput 键盘显示搜索按钮并触发回调

<TextInput returnKeyType"search"returnKeyLabel"搜索"onSubmitEditing{e > {toSearch(keyword);}} /><SearchBarref{serachBarEl}placeholder"请输入"onChangeText{handleChangeSearch}value{search}onSubmitEditing{handleSearch…

react16之前diff算法的理解和总结

此篇文章所讨论的是 React 16 以前的 Diff 算法。而 React 16 启用了全新的架构 Fiber&#xff0c;相应的 Diff 算法也有所改变&#xff0c;本片不详细讨论Fiber。 fiber架构是为了支持react进行可中断渲染&#xff0c;降低卡顿&#xff0c;提升流畅度。 react16之前的版本&…

131.【MySQL_基础篇】

MySQL_基础篇 (一)、MySQL 介绍1.MySQL三大阶段(1).基础篇(2).进阶篇(3).运维篇 2.MySQL 概念3.数据模型(1).关系型数据库(RDBMS) 4.数据库三大范式 (二)、SQL 编程语言1.SQL通用语法2.SQL 四大分类3.DDL (数据定义语言)(1).数据库操作 ->(增删改查)(2).表操作 -> (增删改…

IDEA2023隐藏.idea和.iml文件

IDEA2023隐藏.idea和.iml文件 1. 打开file -> setting,快捷键CtrlAlts2. Editor -> File types3. 点击右侧Ignore files and folders一栏4. 添加需要忽略的文件5. 最重要一步 IDEA新建项目会自动生成一个.idea文件夹和.iml文件&#xff0c;开发中不需要对这两个文件修改&…

LeetCode 92. Reverse Linked List II【链表,头插法】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

react使用hook封装一个tab组件

目录 react使用hook封装一个tab组件Tabbar.jsx使用组件效果 react使用hook封装一个tab组件 Tabbar.jsx import PropsTypes from "prop-types"; import React, { useEffect, useState } from react; export default function Tabbar(props) {const { tabData , cur…

Kotlin File writeText appendText appendBytes readBytes readText

Kotlin File writeText appendText appendBytes readBytes readText import java.io.Filefun main(args: Array<String>) {val filePath "./myfile.txt"val file File(filePath)file.writeText("hello,") //如果原有文件有内容&#xff0c;将完全覆…

【Maven教程】(四)坐标与依赖:坐标概念,依赖配置、范围、传递性和最佳实践 ~

Maven 坐标与依赖 1️⃣ 什么是Maven 坐标2️⃣ 坐标详解3️⃣ 依赖的配置4️⃣ 依赖范围5️⃣ 传递性依赖6️⃣ 依赖调解7️⃣ 可选依赖8️⃣ 最佳实践8.1 排除依赖8.2 归类依赖8.3 优化依赖 &#x1f33e; 总结 正如前面文章所述&#xff0c;Maven 的一大功能是管理项目依赖…

sonarqube版本升级

官方文档&#xff1a;Upgrade guide 步骤1、停止原有sonarqube服务&#xff0c;如果是docker部署的直接停掉容器并删除 步骤2、部署最新版sonarqube&#xff0c;保留原有配置 步骤3、访问sonarqube web 显示维护中&#xff0c;根据官方给出的升级方法&#xff0c;在sonarqub…