快速排序详讲(两种方法)

目录

原理

实现方式

正常实现

理由

先从右到左,在从左到右

先从左到右,先从右到左

挖坑法

效率

优化

测试

代码


原理

快速排序是将最左侧的数字当作关键数字,将关键数字放在对应位置,且关键数字左侧均大于它,右侧均小于它,采用递归的形式左右执行递归

实现方式

正常实现

升序排序:

先从右往左

如果开始位置小于结束位置并且当前位置大于关键数字则继续往左查找

再从左往右

如果开始位置小于结束位置并且当前位置小于关键数字则继续往左查找

两个结束后,此时begin位置大于关键数字,end位置小于,交换begin与end即可实现将关键数字左右两侧满足条件

当begin<end时继续执行如上操作

注意:先从右往左再从左往右不能进行交换

理由

先从右到左,在从左到右

右侧先停,左碰到右,则右侧此时位置小于关键数字,左碰到右,可保证相遇位置数字小于关键数字

左侧先停,右碰到左此时左侧位置为上一轮交换后的位置,即左侧此时小于关键数字,右碰到左,可保证相遇位置数字小于关键数字

先从左到右,先从右到左

与上相反

挖坑法

取出最左侧的数据

进入循环

同样从右往左查找,但是比较的是当前位置和关键数字的值

效率

和堆排序,希尔排序为同一级别

排序100000个数,快排和希尔均只用了10几ms,而冒泡则用了30s

优化

1.

我们可以将第一个数的位置和最后一个数的位置取出,创建mid=(left+right)/2,关键数字则为第一个数,最后一个数和mid三者之间的中间值,将中间值和首元素进行交换即可

2.

当元素个数小于10时,插入排序效率比快排更高,我们可以在此时使用插入排序代替快排

测试

一百万个数据

通过比较后我们可以发现

挖坑法比普通快排快一些,但是差距不大

优化后确实会比没优化要稍微快上一些

代码

void swap(int* p1, int* p2) {int a = *p1;*p1 = *p2;*p2 = a;
}
void insertsort(int* a, int sum) {//插排int begin, end, tmp;for (begin = 0; begin < sum - 1; begin++) {tmp = a[begin + 1];end = begin;while (end >= 0) {if (a[end] > tmp) {a[end + 1] = a[end];end--;}elsebreak;}a[end + 1] = tmp;}
}
int findmid(int* a, int left, int right) {。。中间值int mid = (left + right) / 2;if (a[left] > a[mid]) {if (a[mid] > a[right])return mid;else {if (a[left] > a[right])return right;return left;}}else {if (a[left] > a[right])return left;else {if (a[mid] > a[right])return right;return mid;}}
}
void normalquick(int* a, int left, int right) {//普通if (left >= right)return;int begin = left, end = right, key = left;while (begin < end) {while (begin < end && a[end] >= a[key])end--;while (begin < end && a[begin] <= a[key])begin++;swap(&a[begin], &a[end]);}swap(&a[begin], &a[key]);key = begin;normalquick(a, left, key - 1);normalquick(a, key + 1, right);
}
void quicksort(int* a, int left, int right) {//优化快排if (left >= right)return;if (right - left + 1 < 10) {insertsort(a + left, right - left + 1);return;}int begin = left, end = right, key = findmid(a, left, right);swap(&a[begin], &a[key]);key = left;while (begin < end) {while (begin < end && a[end] >= a[key])end--;while (begin < end && a[begin] <= a[key])begin++;swap(&a[begin], &a[end]);}swap(&a[begin], &a[key]);key = begin;quicksort(a, left, key - 1);quicksort(a, key + 1, right);
}
void quicksorthoare(int* arr, int left, int right) {//挖坑法if (left >= right)return;int begin=left, end=right, key=arr[left];while (begin < end) {while (begin < end && arr[end] >= key)end--;arr[begin] = arr[end];while (begin < end && arr[begin] <= key)begin++;arr[end] = arr[begin];}arr[begin] = key;quicksorthoare(arr, left, begin - 1);quicksorthoare(arr, begin + 1,right);
}
void shellsort(int* arr, int sum) {//希尔排序int i, j, gap=sum, tmp,a;while (gap > 1) {gap = gap / 3 + 1;for (i = 0; i < gap; i++) {for (j = i; j < sum - gap; j+=gap) {tmp = arr[j + gap];a = j;while (a >= 0) {if (arr[a] > tmp) {arr[a + gap] = arr[a];a -= gap;}elsebreak;}arr[a + gap] = tmp;}}}
}
void hoarequick(int* a, int left, int right) {//优化挖坑if (left >= right)return;if (right - left + 1 < 10) {insertsort(a + left, right - left + 1);return;}int begin = left, end = right, key = findmid(a, left, right);swap(&a[begin], &a[key]);key = a[left];while (begin < end) {while (begin < end && a[end] >= key)end--;a[begin] = a[end];while (begin < end && a[begin] <= key)begin++;a[end] = a[begin];}a[begin] = key;hoarequick(a, left, begin - 1);hoarequick(a, begin + 1, right);
}

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

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

相关文章

模拟集成电路(6)----单级放大器(共源共栅级 Cascode Stage)

模拟集成电路(6)----单级放大器&#xff08;共源共栅级 Cascode Stage&#xff09; 大信号分析 对M1 V x ≥ V i n − V T H 1 V x V B − V G S 2 V B ≥ V i n − V T H 1 V G S 2 V_{x}\geq V_{in}-V_{TH1}\quad V_{x}V_{B}-V_{GS2}\\V_{B}\geq V_{in}-V_{TH1}V_{GS2} Vx…

每日一题《leetcode-- LCR 025.两数相加||》

https://leetcode.cn/problems/lMSNwu/ 分别把给定的两个链表翻转&#xff0c;然后从头开始相加。 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ //反转链表 struct ListNode* reverselist(struct ListNode*h…

进程——linux

目录 冯诺依曼体系结构&#xff08;计算机组成原理与体系结构&#xff09; 关于冯诺依曼&#xff0c;必须强调几点&#xff1a; 操作系统(Operator System) 概念 设计OS的目的 定位 如何理解 "管理" 总结 系统调用和库函数概念 承上启下 一、进程 基本概念…

盒模型及其应用(溢出、外边距塌陷)

一、盒模型 盒模型详解-CSDN博客 CSS学习笔记3&#xff1a;CSS三大特性、盒子模型-CSDN博客 1.盒模型组成 &#xff08;1&#xff09;padding padding和border都会撑大盒子&#xff0c;margin不会. 如果没有指定盒子的width/height&#xff0c;那么padding不会撑大盒子。 &am…

详解动态库和静态库

文章目录 前言静态库静态库制作静态库的生成发布静态库使用静态库安装静态库卸载静态库 动态库动态库的制作动态库的生成动态库的发布使用动态库 动态库VS静态库 前言 在C、C中我们使用过标准库&#xff0c;比如在使用strerror、vector、string等时&#xff0c;都只是调用了这…

【对算法期中卷子的解析和反思】

一、程序阅读并回答问题&#xff08;共30分&#xff09; #include<cstdio>#include<cstring>#include<iostream>using namespace std;char chess[10][10];int sign[10];int n, k, ans;void dfs(int x, int k) { if (k 0){ans;return; } if (xk-1 >…

智能学工系统实现学生管理

人才培养是高校的榜首要务&#xff0c;高校在抓好学生教育作业的一起&#xff0c;更多的是要加强对学生的办理作业。作为在校大学生健康成长的指导者和引路人&#xff0c;面临很多的学生办理作业内容杂乱&#xff0c;事无巨细&#xff0c;但在传统的办理方式下&#xff0c;尽管…

Java集合:数据存储与操作的瑞士军刀

Java集合概述 集合是用来存储多个元素的容器。文章从四个方面来概述下集合&#xff0c;让读者对集合有一个大致的了解。 一、 多样化的容器 Java 集合大致包含 2 大体系 Collection体系 List&#xff1a;存储有序、重复的元素 Set&#xff1a;存储无序、不可重复的元素…

摸鱼大数据——Hive函数7-9

7、日期时间函数 Hive函数链接&#xff1a;LanguageManual UDF - Apache Hive - Apache Software Foundation SimpleDateFormat (Java Platform SE 8 ) current_timestamp: 获取时间原点到现在的秒/毫秒,底层自动转换方便查看的日期格式 常用 to_date: 字符串格式时间…

【Self-Attention——Transform—Bert】相关的基础理论

1.Self-Attention模型图解 传统的循环神经网络&#xff0c;如上左图1&#xff0c;并不能解决并行化的问题&#xff0c;右图就是一个self-Attention可以实现并行化&#xff0c;并且能解决对于所有信息的读取利用。 将self—Attention替换相应的GRU或者RNN&#xff0c;就能实现从…

单片机原理及应用复习

单片机原理及应用 第二章 在AT89S52单片机中&#xff0c;如果采用6MHz晶振&#xff0c;一个机器周期为 2us 。 时钟周期Tocs1focs 机器周期 Tcy12focs 指令周期&#xff1a;一条指令所用的时间&#xff0c;单字和双字节指令一般为单机器周期和双机器周期。 AT89S5…

Sentinel限流学习

Sentinel限流学习 初识Sentinel运行sentinel雪崩问题服务保护技术对比微服务整合Sentinel 限流规则簇点链路 流控模式-关联流控模式-链路流控模式有哪些&#xff1f; 流控效果流控效果-warm up流控效果-排队等待 热点参数限流隔离和降级Feign整合Sentinel线程隔离有两种方式实现…

【论文复现|智能算法改进】基于多策略麻雀搜索算法的机器人路径规划

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.改进点 改进的无限折叠迭代混沌映射 无限折叠迭代映射(ICMIC) 常用于图像加密方向的研究, 基本思想是首先生成[0,1]之间的混沌序列, …

摸鱼大数据——Hive函数10-12

10、堆内存错误 报错&#xff1a; Error while processing statement: FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. Java heap space 解决方案: 在node1上面操作即可 方式1: 找到/export/server/hive/conf/hive-env.sh,添…

CTF本地靶场搭建——静态flag题型的创建

静态flag题型的创建 首先这里要说的是静态flag和动态flag。 在CTF&#xff08;Capture The Flag&#xff09;比赛中&#xff0c;静态flag的使用通常与特定的赛制或题目类型关联&#xff0c;而不是直接与题型绑定。静态flag意味着这些flag是预先设定好的&#xff0c;不会随比…

MySQL 导出导入的101个坑

最近接到一个业务自行运维的MySQL库迁移至标准化环境的需求&#xff0c;库不大&#xff0c;迁移方式也很简单&#xff0c;由开发用myqldump导出数据、DBA导入&#xff0c;但迁移过程坎坷十足&#xff0c;记录一下遇到的各项报错及后续迁移注意事项。 一、 概要 空间问题源与目…

排序进阶----快速排序

当我们写了插入和希尔排序后&#xff0c;我们就应该搞更难的了吧。大家看名字就知道我们这篇博客的内容了吧。而且从名字上来看。快速排序就很快吧。那么为什么这个排序怎么能叫快速排序啊。我们希尔排序不是很快嘛。那么我们的快速排序肯定是有特殊之处嘞。不然这就太自负了。…

autodl服务器中YOLOx训练自己数据集

目录 本篇文章主要讲解使用YOLOx训练自己数据集&#xff0c;其中包括数据集格式转换~ 目录 一、数据集处理二、环境配置三、配置文件修改四、开始训练五、开始验证 一、数据集处理 第一步&#xff1a;将yolo格式的数据集转换成VOC格式 转换脚本&#xff1a;txt_to_xml.py f…

Unity DOTS技术(二)ECS

文章目录 一.ECS简介二.基本操作实例三.实体查看组件四.位置实体修改五.旋转实体六.了解原有属性七.禁止自动创建八.动态实例化 一.ECS简介 ECS全称 (Entity Component System).即(E:实体 C:组件 S:系统). 实际上即是数据方法分离.数据放在组件里,具体实现放在系统里.组件挂载…