数据结构与算法基础(王卓)(35):交换排序之快排【第二阶段:标准答案、初步发现问题】

news2024/9/28 17:33:04

目录

第二阶段:一分为二

整个快排算法的程序运行大框架:

做出的改动(和原来程序的区别):

 Project 1:

PPT标准答案:

 Project 1小问题:

 Project 1还存在着一个巨大的问题:

具体问题:

具体深挖解决问题建下节



第二阶段:一分为二

分别对该表划分为的两个子表分别进行该遍历排序操作,再划分为更细分的子表

直至子表单位为1(一个元素)为止

没错,他说的也有道理,我上面写的操作,

其实只能对整张表的第一个元素进行操作,未免有些不太灵活

按他的思路基于上面写的程序进行修改,并补充完整快排算法的整个框架程序:


整个快排算法的程序运行大框架:

  1. 确定中枢
  2. 对前半个表进行遍历(嵌套递归我们对整个表的算法操作)
  3. 对后半个表进行遍历

做出的改动(和原来程序的区别):

传入int low,int high两个元素:

确定(限制)整个程序该循环内所能进行操作改动的范围


L.r[0]初值改为 L.r[low]:


让这个遍历的函数变得更加灵活,不必每次都只能对第一个元素进行比较遍历


函数的功能定制为:

  • 操作的数据范围为:high到low
  • 用来作为程序比较遍历的对象为:传入的low的初值

 Project 1:

int 遍历(SqList &L, int low, int high)
{
    L.r[0] = L.r[low];
    while (low < high)
    {
        if (L.r[high].key < L.r[0].key)
        {
            L.r[low] = L.r[high];
            low++;
        }
        else
            high--;
        if (L.r[0].key < L.r[low].key)
        {
            L.r[high] = L.r[low];
            high--;
        }
        else
            low++;
    }
    L.r[low] = L.r[high] = L.r[0];
    return low;
}

void QuickSort(SqList& L, int low, int high)
{
    int pivot = 遍历(L, low, high);
    QuickSort(L, low, pivot-1);
    QuickSort(L, pivot + 1, high);
}

然后这个时候我本以为我们写的已经差不多了,然后去看了一下标准答案:


PPT标准答案:

int Partition(SqList& L, int low, int high)
{
    L.r[0] = L.r[low];  //复制到哨兵位置
    KeyType pivotkey = L.r[low].key;
    while (low < high) 
    {
        while (low < high && L.r[high].key >= pivotkey)
            high--;  
        L.r[low] = L.r[high];

        while (low < high && L.r[low].key < pivotkey)
            low++;
        L.r[high] = L.r[low];

    }
    L.r[low] = L.r[0];
    return low;
}

void QuickSort(SqList& L, int low, int high) {
    if (low < high)
    {
        int pivotloc = Partition(L, low, high);  //将L一份为二
        QuickSort(L, low, pivotloc - 1);  //对低子表递归排序
        QuickSort(L, pivotloc + 1, high);  //对高子表递归排序
    }
}

OK,本来我也觉得不以为然,乍一看没什么大问题了,只剩下一个无伤大雅的


 Project 1小问题:

补充条件语句:快排要求必须 (low < high)

结果到整的去尝试了一下带入实例了以后发现


 Project 1还存在着一个巨大的问题:

具体问题:

运行逻辑机制问题,我们就拿PPT上的实例来说事吧:

将逐次具体操作转化为表格展示如下: 

第几步操作Low指向High指向
第1步49变哨兵18
第2步

49'不动,high--(第一个 if / else 判断)

17
第3步49不动,low++(第二个 if / else 判断)27


这里到了第三步,明显就开始出问题了:

空格里面还没有元素呢,你这个算法就开始超过他、跳跃到下一格,干什么?

重复比较无伤大雅,但是low移动了,危险!!!(要出错了)

这里很明显,我们可以看到,问题出在:

在第一个处理的元素被放到哨兵里后,我们又去拿这个元素本身比较哨兵

也就是自己比较自己,错过了这个空格;

而不是用这个空格来装第一个小于哨兵的元素

具体深挖解决问题见下节

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

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

相关文章

嵌入式软考备考_8 软件测试

软件测试 测试&#xff1a;在规定的条件下操作程序&#xff0c;以发现错误&#xff0c;对软件质量进行评估。 对象&#xff1a;程序&#xff0c;数据&#xff0c;文档。 目的&#xff1a;发现错误&#xff0c;看是否满足用户需求&#xff0c;发现错误产生的原因&#xff08;…

汇编四、51单片机汇编指令2

1、机器码 (1)MOV A,#0x60对应机器码为7460 (2)7460对应二进制 0111 0100 0110 0000 0x74对应指令&#xff0c;0x60对应立即数。 (3)immediate data翻译为立即数。 (4)可人为查表把汇编转为机器码&#xff0c;也可通过编译器把汇编转为机器码。 2、汇编常见缩写 (1)Rn: n可…

leetcode-040-组合总和2

题目及测试 package pid040; /* 40. 组合总和 II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意&#xff1a;解集不能包含重复的组合…

Vue中使用EasyPlayer播放H265视频流

需求说明 需要在Vue2的项目中使用EasyPlayer进行H265视频流的播放。使用官方的最新版本加载H265会有问题。一直处于加载中… 实现步骤 引入easyplayer,这里最开始引入了最新版会有问题&#xff0c;因此引入的是3.3.12版本&#xff0c;可参照官方文档进行配置。 EasyPlayer示…

HBase整合Phoenix

HBase整合Phoenix 创建软件目录 mkdir -p /opt/soft cd /opt/soft下载软件 wget https://dlcdn.apache.org/phoenix/phoenix-5.1.3/phoenix-hbase-2.5-5.1.3-bin.tar.gz解压 hbase tar -zxvf phoenix-hbase-2.5-5.1.3-bin.tar.gz修改 hbase 目录名称 mv phoenix-hbase-2.5…

(初)进程概念

目录 认识冯诺依曼系统 操作系统(Operator System) 设计OS的目的&#xff1a; 定位&#xff1a; 如何理解管理&#xff1a; 总结&#xff1a; 系统调用和库函数概念&#xff1a; 进程 基本概念 &#xff1a; 描述进程PCB task_struct - PCB的一种 task_struct内容分…

编译安装最新的Linux系统内核

现在还有不少机器是CentOS8 Stream系统&#xff0c;虽然上了贼船&#xff0c;不影响用就是了。8的编译和7大同小异&#xff0c;只是踩了更多的坑在这里记录一下&#xff0c;或许会帮到看到的朋友。 安装编译环境 CentOS8安装必要的包 yum groupinstall "Development Too…

【P13】JMeter 常数吞吐量定时器(Constant Throughput Timer)

文章目录 1、基于计算吞吐量&#xff1a;只有此线程2、基于计算吞吐量&#xff1a;所有活动线程3、基于计算吞吐量&#xff1a;当前线程组中的所有活动线程4、基于计算吞吐量&#xff1a;所有活动线程&#xff08;共享&#xff09;5、基于计算吞吐量&#xff1a;当前线程组中的…

【2023/05/08】雅卡尔织布机

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第3天。 Share The world puts off its mask of vastness to its lover. It becomes small as one song,as one kiss of the eternal. 译文&#xff1a; 世界对着它的爱人&#xff0c;把它浩瀚的面具揭…

已做过算法题总结2

20. 有效的括号 (括号匹配是使用栈解决的经典问题&#xff0c;这道题主要是记住三种不成立的情况) 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用…

解密链表元素移除:三种巧妙思路,轻松驱逐难缠结点

本篇博客会讲解力扣“203. 移除链表元素”的解题思路&#xff0c;这是题目链接。 老规矩&#xff0c;先来审题&#xff1a; 以下是一些示例&#xff1a; 以下是提示&#xff1a; 本题的思路还挺多的&#xff0c;不过都是链表的常规操作。 思路1 万能的尾插法。遍历链表&am…

[Golang] 爬虫实战-用多层嵌套结构体去接收多层嵌套数据

&#x1f61a;一个不甘平凡的普通人&#xff0c;致力于为Golang社区和算法学习做出贡献&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;算法学习 &am…

量子计算(10)编程实践2:隐形传态算法

目录 一、算法目的 二、算法原理 三、pyqpanda实现代码 四、测试结果 一、算法目的 量子隐形传态&#xff0c;又称量子遥传、量子隐形传输、量子隐形传送、量子远距传输或量子远传&#xff0c;是一种利用分散量子缠结与一些物理讯息的转换来传送量子态至任意距离的位置的技…

AutoSar CAN网络管理(CanNm)

文章目录 网络管理目的主动唤醒和被动唤醒状态管理1. 总线睡眠模式&#xff08;Bus-Sleep Mode&#xff09;2. 准备总线睡眠模式&#xff08;Prepare Bus-Sleep Mode&#xff09;3. 网络模式&#xff08;Network Mode&#xff09;3.1 重复报文状态(RepeatMessageState)3.2 常规…

基于springboot+mysql+jpa+html实现商品销售信息系统

基于springbootmysqljpahtml实现商品销售信息系统 一、系统介绍1、系统主要功能&#xff1a;2.涉及技术框架&#xff1a;3.本项目所用环境&#xff1a; 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能&#xff1a; 订单管理模块 商品管理模块 品牌管理模…

【项目实战】—— 我们应该如何正确得创建线程池?

项目实战-我们应该如何正确得创建线程池&#xff1f; 对于现在而言多线程编程已经成为程序员必备的职业技能了&#xff0c;在开发实践过程中&#xff0c;你是否也遇到过相关多线程问题&#xff0c;比如创建多少线程才是合适的&#xff1f;线程池该如何创建&#xff1f;今天我们…

类和对象中(2)

文章目录 一、运算符重载1、运算符重载出现的原因2、在全局和类里实现运算符重载3、赋值运算符重载1、为什么赋值运算符重载不能写在全局 &#xff1f;2、什么时候需要自己实现赋值运算符重载 &#xff1f; 4、前置和后置重载5、运算符重载的优势 二、const成员函数1、两个常见…

GNN与MLP:GNN是一种泛化器

图神经网络&#xff08;GNN&#xff09;作为图表示学习的模型&#xff0c;建立在MLP架构之上&#xff0c;具有额外的消息传递&#xff0c;以允许特征在节点之间流动。作者通过引入一个被称为P-MLP的中间模型&#xff0c;将GNN性能增益的主要来源定位为其内在的泛化能力&#xf…

JSR303统一校验和分组校验及常用注解@NotBlank@NotEmpty 的使用

JSR303-bean校验规范 JSR303常用注解&#xff0c;下面注解在JavaBean的字段上使用&#xff0c;必须在方法上搭配Vaild才会开启校验&#xff0c;也可以设置分组校验 Null 必须为空 主键字段常用&#xff0c;可以规定新增时字段必须为空NotNull 不能为null 添加数字时使用常用&…

前端学习笔记:CSS中浮动的原理,定位

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育 目录 1、float1.1、float设计的初衷1.2、浮动的原理&#xff0c;类似两个图层1.3、浮动的原理&#xff0c;两个图层的特殊性1.4、消除浮动的影响 2、定位2.1、相对定位&#xff08;relative&#xff09;2.2、绝对定…