数据结构与算法基础(王卓)(35):交换排序之快排【第一阶段:第一遍遍历】

news2024/12/25 22:41:14

目录

快速排序:

法一:

法二:(常用、重难点)

第一阶段:第一遍遍历

Project 1:

问题:

Project 2:

问题:

Project 3:

问题:

Project 4:

Project 5:


快速排序:

法一:

第一位放哨兵,从左往右遍历:大的放最后,小的放最前,最后哨兵放中间

继续对新表进行同样的算法操作(递归)

直至操作遍历完所有元素为止

法二:(常用、重难点)

 详细思路不再赘述,可以去看王卓老师视频

第14周06--第8章排序6--8.3交换排序2--快速排序1_哔哩哔哩_bilibili

或者直接看下列代码理解思路:


第一阶段:第一遍遍历


Project 1:

void 遍历一遍(SqList L)
{
    int low, high;
    L.r[0] = L.r[1];
    low = 1;
    high = L.length;
    while (low < high)
    {
        if (L.r[high].key < L.r[0].key)
        {
            L.r[low] = L.r[high];
            low++;
        }
        if (L.r[0].key < L.r[low].key)
        {
            L.r[high] = L.r[low];
            high--;
        }
    }
}

通过看视频操作我们发现,我们这里写的程序存在一定的

问题:

在我们写的程序语句里:

当元素不需要移动的时候,我们对程序没有进行任何操作

这样当程序出现不需要移动的元素的时候,我们的程序就开始停滞不前

甚至当low和high都出现该种情况的时候,程序会直接进入死循环停止


Project 2:

void 遍历一遍(SqList L)
{
    int low, high;
    L.r[0] = L.r[1];
    low = 1;
    high = L.length;
    while (low < high)
    {
        if (L.r[high].key < L.r[0].key)
            L.r[low] = L.r[high];
        low++;
        if (L.r[0].key < L.r[low].key)
            L.r[high] = L.r[low];
        high--;
    }
}

问题:

但是其实我们这样改/把程序改成这样也不对,在我们写的程序语句里:

当我们对元素进行移动了以后

我们还要去进行移动low和high指针的操作

这样我们后面下一个要(需要)移动的元素

就没办法插入到空格(空着)的元素里面了


Project 3:

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

问题:

在这里,我们对程序的更改未免有点矫枉过正了

实际上,因为我们对程序执行的流程不清晰,导致了我们的思维混乱

结果我们对程序的修改越改越错:

当程序指向的元素需要移动时,移动完以后:

原来该元素的指针不用动(作为下一轮指向空格元素的指针)


        if (L.r[high].key < L.r[0].key):

high不动

        if (L.r[0].key < L.r[low].key):

low不动


然后:

该元素移动到的位置的指针需要移动,我接下来总不能是来比较你这个上一轮刚刚移动的元素吧:


        if (L.r[high].key < L.r[0].key):

low++


        if (L.r[0].key < L.r[low].key):

high--


Project 4:

void 遍历一遍(SqList L)
{
    int low, high;
    L.r[0] = L.r[1];
    low = 1;
    high = L.length;
    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++;
    }
}

Project 5:

另外,我们对于这个程序算法还缺少最后一步操作:把哨兵重新放到中间去

void 遍历一遍(SqList L)
{
    int low, high;
    L.r[0] = L.r[1];
    low = 1;
    high = L.length;
    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];
}

OK,实际上这里我还是预留了一个小彩蛋给大家的,感兴趣的话可以看一看下一篇日记哦

哈哈,实际上你们必须得看、不得不看,因为这里我们写的语句虽然没错,但也不完全对,哈哈

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

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

相关文章

spring-模型数据和视图---视图解析器的说明以及大量代码演示

目录 spring-模型数据 ● 说明 应用实例需求 创建后面所有代码执行成功之后跳转的vote_ok.jsp页面 方式 1: 通过 HttpServletRequest放入 request 域 创建 Master类 创建Pet类 创建model_data.jsp 修改 VoteHandler增加方法 创建vote_ok.jsp, 显示数据 完成测试(Post…

初级算法-动态规划

主要记录算法和数据结构学习笔记&#xff0c;新的一年更上一层楼&#xff01; 初级算法-动态规划 一、斐波那契数二、爬楼梯三、使用最小花费爬楼梯四、不同路径五、不同路径二六、整数拆分七、不同的二叉搜索树八、0-1背包九、分割等和子集十、最后一块石头的重量十一、目标和…

深入浅出分支语句—【C语言】

目录 前言&#xff1a;为什么要学习分支和循环语句呢&#xff1f; 1. 语句的分类 2. 分支语句&#xff08;选择语句&#xff09; 2.1 if-else语句 注意点&#xff1a;if-else语句后面不加{}&#xff0c;默认只能跟一条语句 2.2 switch语句 注意点&#xff1a; 前言&…

平衡二叉树旋转机制

概念 平衡二叉树的旋转机制是一种通过对树进行旋转操作来保持其平衡的方法。 分类 平衡二叉树的旋转机制包括两种基本类型的旋转&#xff1a;左旋和右旋&#xff0c;以及它们的组合。 左旋 左旋是将一个节点的右子节点旋转到它的位置上&#xff0c;同时将该节点移到其左侧&…

关于低代码开发,你是真的了解了吗?

在低代码开发已是大势所趋的今天&#xff0c;不少企业都切身感受到了低代码开发带来的便利。低代码开发平台的优势在当下数字化浪潮中&#xff0c;为企业提供了定制专属的数字化解决方案。 低代码本身没有太强的行业属性&#xff0c;这也让低代码开发平台能够更加灵活地适应不同…

嵌入式 QT 界面布局管理

目录 1、实例程序功能 2、界面组件布局 2.1 界面组件的层次关系 2.2 布局管理 2.3 伙伴关系和Tab顺序 1、实例程序功能 创建一个 Widget Application 项目 samp2_2&#xff0c; 在创建窗体时选择基类 QDialog &#xff0c;生成的类命名为 QWDialog &#xff0c;并选择…

Python实用记录(十三):python脚本打包exe文件并运行

文章目录 打包准备文件准备环境安装 具体运行第一步第二步第三步 注意 打包准备 文件准备 这里准备一个简单的python代码&#xff08;打开电脑摄像头&#xff09; import cv2 if __name__ __main__:cap cv2.VideoCapture(0)ret, frame cap.read()while ret:ret, frame c…

希亦洗地机和添可洗地机哪个好用?口碑洗地机详细对比

在当今这个科技发达的社会&#xff0c;为了能够帮助人们高效率的工作&#xff0c;各色各样的发明不断出现。扫地、拖地是我们日常生活中再普通不过的一项家务了&#xff0c;对于小型的房子而言打扫起来就比较轻松&#xff0c;对于繁忙的上班族打扫空间较大的房子就很困难&#…

Undo Log详解

undo log 基本概念 undo log是一种用于撤销回退的日志&#xff0c;在数据库事务开始之前&#xff0c;MySQL会先记录更新前的数据到undo log日志文件里面&#xff0c;当事务回滚时或者数据库崩溃时&#xff0c;可以利用 undo log来进行回退 Undo Log产生和销毁&#xff1a;Und…

redis(2)

缓存:缓存是一个高速数据交换的存储器&#xff0c;使用它可以迅速的访问和操作数据 因为单体应用已经不适用于现在的环境了,所以最终变成分布式系统,本地缓存已经不适用了 1)比如说张三用户访问了应用程序nginx把请求分配给A服务器 A机器查询数据库&#xff0c;并且把数据库的结…

模型实战(11)之win10下Opencv+CUDA部署yolov5、yolov8算法

win10下Opencv+CUDA部署yolov5、yolov8算法 测试环境:AMDRH7000+RTX3050+win10+vs2-10+opencv455+cuda11.7关于opencv470+contrib+cuda的编译,可以详见:Win10下Opencv+CUDA联合编译详细教程本文代码同时支持yolov5、yolov8两个模型,详细过程将在文中给出,完整代码仓库最后…

自动化测试真的能提效吗?怎么才能真正掌握自动化测试技巧呢?

近年来&#xff0c;随着软件开发速度的提高&#xff0c;自动化测试已经成为了一个必要的环节。但是&#xff0c;对于自动化测试&#xff0c;有些人认为它能够大幅提升效率&#xff0c;而有些人则认为自动化测试无法替代手工测试&#xff0c;并且实施自动化测试需要投入大量的时…

vue3 - 超详细头像裁剪并上传到服务器,支持按照自定义比例裁切图片效果组件插件(详细示例源码教程,一键复制运行开箱即用)

效果图 大部分都贼难用,而且全是bug。。并且很少有 vue3的,全是 vue2。。 本博客实现了在 vue3.js 项目中,实现图像上传后并按一定的比例进行裁剪的示例功能源码,支持各种参数、样式修改, 示例有 Element Plus + Vue3.js 版本,也有纯 Vue3.js 版本(无 UI 框架搭配),按…

【机器学习】西瓜书课后习题参考答案—第一章

记录西瓜书课后习题的思考与参考答案。 1.1 表1.1中若只包含编号为1和4的两个样例&#xff0c;试给出相应的版本空间。 答&#xff1a; 版本空间&#xff1a;与训练集一致的“假设集合”&#xff0c;称之为“版本空间”&#xff08;version space&#xff09; 只包含编号为1和…

Vue-cli搭建项目(包含Node.js安装和ElementUI安装)

目录 一、vue-cli 二、Node.js npm&#xff1a; Node.js安装&#xff1a; 测试&#xff1a; 三、Vue-cli搭建项目 使用HBuildex 创建一个vue.js项目 创建的自己的组件&#xff1a; 组件路由&#xff1a; 四、ElementUI安装 1.ElementUI下载&#xff1a; 2.在main.js中…

Echarts图表X轴文本过长导致展示不全

今天就遇到如题目所说问题。遇到问题当然取看官方文档喽&#xff0c;链接奉上ECharts-axis 博主使用的ECharts版本号为5.4.5 这个问题效果图如下&#xff1a; 可以看到x轴文本太长&#xff0c;导致部分x轴标签无法正常显示&#xff0c;在这里提供两种解决办法&#xff0c;并告诉…

OSI七层网络模型+TCP/IP四层模型

OSI七层模型&#xff1a; 物理层&#xff1a;主要定义物理设备标准&#xff0c;如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流&#xff08;就是由1、0转化为电流强弱来进行传输&#xff0c;到达目的地后再转化为1、0&#xff0c;也就…

6、Flutterr聊天界面网络请求

一、准备网络数据 1.1 数据准备工作 来到网络数据制造的网址,注册登录后,新建仓库,名为WeChat_flutter;点击进入该仓库,删掉左侧的示例接口,新建接口. 3. 接着点击右上角‘编辑’按钮,新建响应内容,类型为Array,一次生成50条 4. 点击chat_list左侧添加按钮,新建chat_list中的…

华为OD机试2023年最新题库(JAVA)

目录 华为OD机试是什么&#xff1f;华为OD面试流程&#xff1f;华为OD机试通过率高吗&#xff1f;华为OD薪资待遇&#xff1f;华为OD晋升空间&#xff1f;华为OD刷题列表&#xff0c;一天三题&#xff0c;刷出算法新高度&#xff0c;刷出人生新际遇。 大家好&#xff0c;我是哪…

什么是http代理504网关超时错误,要如何修复?

当你在使用 HTTP 代理时&#xff0c;有时候会遇到"504 网关超时"错误&#xff0c;这个错误看起来非常可怕&#xff0c;但实际上它并不是一个很难解决的问题。在本文中&#xff0c;我将向你介绍 504 错误的定义&#xff0c;以及为什么我们会遇到这个错误&#xff0c;同…