快速排序的单趟排序方法对比

news2024/11/24 5:29:36

 这里的霍尔法内容来自文章:【排序算法】快速排序(C语言)_c语言快速排序-CSDN博客

霍尔法 

单趟排序使用霍尔法,这样的话我们必须保证除了指针停留的位置到头之外,最后首尾指针共同指向的是一个比key小的值,所以我们的做法是让右指针先移动,因为right找比key小的值,所以此时right的位置一定比key小。

这种方法思路上最为简单,但不太好的原因在于最后那个值很可能是一个与上一轮挑出来要插入的值很接近的,那么直接将它放到左边一半的话,左边这个区间进行一趟排序操作之时很可能遇到的情况是分了等于没分,因为选定要插入的值往往是第一个,而这里的第一个又是一个与上一轮中第一个数很接近的数,即为左边区间的最大值,那么自然分了几乎等于没分(选择了划分效率最低的情况),因为我们理想的划分情况是希望能划分的数是当前区间的中值元素,这样能尽可能将区间划分成的左右区间尽可能数量相等。

当然这个也是可以解决的,就是我们不要选定插入的值为当前序列的第一个值,可以选择为插入的值为当前序列的中间值。这样也可以完美解决问题。

蛮横小公主法

当然我们也有别的方法来使得,在每次选定插入的值可以是第一个的方法,下面展示它的一趟操作步骤,为了便于记忆我将她叫做(蛮横小公主法),书上没有定义它的名字,起名原因在后面。

题目:待排列的表中有10个元素,关键字的集合为{38,30,50,16,35,76,48,44,28,31},下面是描述第一趟排序的过程示意图

可以看到这里面定义了两个指针i,j分别指向首尾元素,还有一个temp变量,用来保存第一个元素,也就是我们要插入到中间的元素,这个变量我们可以看到仅仅在一开始保存一下第一个元素,然后在最后恢复一下,中间过程和temp变量无关。

具体过程:

右指针j先开始向左遍历,找到比temp小的元素停下来,然后将这个值复制到左指针i指向的元素,相当于直接覆盖掉原来的元素值(你可能很震惊,先看下去),然后右指针停下来,左指针向右移动,当左指针找到比temp大的元素时,同样将左指针指向的元素复制到右指针指向的,相当于直接覆盖掉原来的元素值。然后左指针停止右指针开始像左边移动,重复上述过程,直到左指针和右指针重合i==j,停止,然后将temp的值赋值回i和j共同指向的位置。

接下来解释一下上面操作,为什么可以直接覆盖,其实覆盖的时候我们只是将一个覆盖掉了,而且是将不合适位置上的的这个重复值给覆盖掉了,比如看下面图中以50覆盖31,就是覆盖的31错误的位置,31在左侧还有一份,在正确合适的位置而存在着。而每次我们覆盖后,那个停下来的指针其实都指向的是一个应该被删除的元素。最终两个指针指向同一个位置,这个位置也是应该被删除的重复元素,此时以temp来覆盖。那你可能还有一个疑问第一次覆盖的时候38就被直接覆盖掉了,38在序列中就不存在了,确实是这样,但是我们一开始就将序列第一个元素存在了temp中,而且你会发现因为是右指针首先移动,所以第一个被覆盖的元素肯定是第一个位置上元素,所以这个算法是合理的。

这个算法乍一下看上去确实可能比较复杂,但是看懂了之后你会觉得这个算法其实思路上很顺畅。至于为什么我叫她蛮横小公主,因为她相比上一个来说会直接覆盖掉另一个指针指向的元素,实在是太蛮横了。大家可以结合我右边用线连起来的这个图来思考。这样流程就很清晰了。

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

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

相关文章

启动盘制作

魔术师pe安装教程 我一般使用魔术师来安装windows系统 魔术师pe地址下载 解压后使用 把ios映像文件放入pe系统u盘下 开机按f1,进入bios,将usb接口拉到本电脑,在按f10保存,在按f12即可找到pe的u盘 ventoy安装教程 其他系统安装我使用ventoy ventoy地…

一个5000刀的XSS

背景介绍 今天分享国外一个白帽小哥Crypto通过发现Apple某网站XSS而获得5000美元赏金的故事。废话不多说,让我们开始吧~ 狩猎过程 易受攻击的 Apple 服务网站是:https://discussions.apple.com,该服务是苹果用户和开发者讨论问题…

【笔记】Simulink与Workbench交互+自定义m函数封装为Simulink模块

以如下三角函数为例,说明建模方法 ya*sin(b*2*pi*uc);0.总模型总代码 总模型 总代码: clc clear close allt_all10; a10; b1; c0;%pi/2; delta_t0.01; simOutsim(test240430); out_tsimOut.tout; out_y1simOut.yout{1}.Values; out_y2simOut.yout{2}.…

栈的磁盘优化:降低存取成本的算法与实现

栈的磁盘优化:降低存取成本的算法与实现 问题背景简单实现方法的分析实现方法PUSH操作POP操作成本分析渐近分析 优化实现方法实现方法成本分析渐近分析 进一步优化:双页管理策略实现方法管理策略成本分析 伪代码示例C代码示例结论 问题背景 在具有有限快…

WAAP动态安全解决方案

随着企业数字化进程不断加速,应用安全面临多重威胁,新型攻击方式层出不穷,常见的攻击形式包括Web应用攻击、DDoS攻击、API攻击、恶意爬虫攻击等。企业正面临严峻的安全防护挑战,需寻找一个可靠、全面的安全解决方案。在此情况下&a…

题目:吃奶酪

问题描述: 解题思路: 枚举每种吃奶酪顺序,并计算其距离,选择最小的距离即答案。v数组:记录顺序。 注意点:1. 每次用于min的s需要重置为0。 2. 实数包括小数,所以结构体内x,y为double类型。 3. 第…

基于大爆炸优化算法的PID控制器参数寻优matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于大爆炸优化算法的PID控制器参数寻优matlab仿真。对比优化前后的PID控制输出。 2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a .....................…

文件API及其操作

这里介绍两类文件操作、三个文件类。包括文件系统操作(File类)、文件内容操作(操作字节流、操作字符流) 1.文件类File 1.1.认识File类 (1)什么是File类呢?其实就是可以操作文件的一个类。通过…

Hdfs小文件治理策略以及治理经验

小文件是 Hadoop 集群运维中的常见挑战,尤其对于大规模运行的集群来说可谓至关重要。如果处理不好,可能会导致许多并发症。Hadoop集群本质是为了TB,PB规模的数据存储和计算因运而生的。为啥大数据开发都说小文件的治理重要,说HDFS 存储小文件…

LeetCode 139 —— 单词拆分

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 定义 d p [ i ] dp[i] dp[i] 表示 s [ 0 , i ] s[0, i] s[0,i] 是否可以被字典中出现的单词拼接,那么状态转移方程为: d p [ i ] t r u e ,如果存在任意 j ∈ [ 0 , i − 1…

无人机+飞行汽车:低空经济新引擎,有望爆发式增长

无人机和飞行汽车作为低空经济的新引擎,正在引领一场全新的交通革命。随着技术的不断进步和政策的支持,低空经济有望成为未来经济发展的重要领域,实现爆发式增长。 首先,无人机和飞行汽车具有独特的优势和应用场景。无人机可以在…

数据结构与算法-单向环形链表与约瑟夫问题

1.简介 单向环形链表&#xff0c;闭合的形成一个环。 单向环形链表的一个应用场景是约瑟夫问题。 约瑟夫问题为&#xff1a;设编号为1&#xff0c;2&#xff0c;…&#xff0c;n的n个人围坐一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人…

可完成两个变量数值的交换的两种方式【swap函数定义及调用的两种方式】

既然传值调用无法完成两个变量数值的交换&#xff0c;那么可完成该任务的正确方式有以下两种&#xff1a; 方式一&#xff1a;传址调用 //方式一&#xff1a;传址调用 #include <stdio.h>void swap(int* p1, int* p2);int main() {int a 5;int b 9;int* pointer_1 &…

【iOS】pthread、NSThread

文章目录 前言一、pthread 使用方法pthread 其他相关方法 二、 NSThread创建、启动线程线程相关用法线程状态控制方法NSThread 线程安全和线程同步场景 线程的状态转换 前言 五一这两天准备将GCD相关的知识完&#xff0c;同时NSOperation与NSThread、pthread也是相关知识&…

240503-关于Unity的二三事

240503-关于Unity的二三事 1 常用快捷键 快捷键描述CtrlP播放/停止Ctrl1打开Scene窗口Ctrl2打开Game窗口Ctrl3打开Inspect窗口Ctrl4打开Hierarchy窗口Ctrl5打开Project窗口Ctrl6打开Animation窗口 2 关联VisualStudio2022 3 节约时间&#xff1a;将最新声明的参数移动到最上…

MySQL-集群1

一、为什么要用mysql集群&#xff1f;&#xff1a; mysql单体架构在企业中很少用&#xff0c;原因&#xff1a;①会形成单点故障&#xff0c;没有高可用的效果&#xff1b;②mysql本身是一个I/O能力比较差&#xff0c;并发能力比较差的应用服务&#xff0c;在较高规模的网络I/…

C#知识|将选中的账号信息展示到控制台(小示例)

哈喽,你好啊,我是雷工! 上篇学习了控件事件的统一关联, 本篇通过实例练习继续学习事件统一处理中Tag数据获取、对象的封装及泛型集合List的综合运用。 01 实现功能 在上篇的基础上实现,点击选中喜欢的账号,选中按钮底色变为蓝色,当选择完毕,点击保存选择时,将选中的…

Java InputStream实战指南:轻松读取、操作文件流

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Themis新篇章:老牌衍生品协议登陆Blast L2,探索全新经济模型

本文将深入分析 Themis 的最新经济模型&#xff0c;探讨其核心概念和机制、优势与创新之处、风险与挑战。 一、引言 随着区块链技术的不断发展&#xff0c;DeFi 衍生品项目逐渐成为市场的焦点。而用户体验的革新&#xff0c;进一步的金融创新&#xff0c;去中心化治理方案的优…

Sharding Capital: 为什么投资全链流动性基础设施 Entangle ?

写在前面&#xff1a;Entangle 项目的名称取自于量子纠缠(Quantum entanglement)&#xff0c;体现了项目对于构建连接、关联和互通的愿景。就像量子纠缠将不同的粒子联系在一起&#xff0c;Entangle 旨在通过其跨链流动性和合成衍生品的解决方案将不同的区块链网络连接在一起&a…