排序-快速排序

前言

本期主角

是这个小老头

图灵奖得主,

美国国家科学院外籍院士,

美国国家工程院外籍院士,

英国皇家工程院院士,

英国皇家学会院士

鼓掌👏👏👏

感觉这个小老头很叼噢(确实很叼)

从标题就知道,他的作品叫快速排序

希尔排序都是以自己名字命名的,

他的就俩字,Quick

可见这个算法的优秀性,

目前,快速排序是效率最快的排序之一

基本思想

  • 从待排序的数组中选取一个基准值.
    (我们把基准值记为key)

  • 再将数组分为两部分:
    1. 左子数组所有元素小于基准值
    2. 右子数组所有元素大于基准值

  • 左右子数组再选基准值重复这个过程

hoare版图示理解

(共三个版本,hoare版是最初版)

先定义一个乱序数组

思路:

  1. 将第一个元素6作为基准值
  2. 定义两个指针指向:第一和最后的位置
  3. 左边的指针(L)找比基准值大的值
  4. 右边的指针( R)找比基准值小的值
  5. R先走,找到满足要求的值后停止
  6. L后走,找到满足要求的值后停止
  7. L和R都停止,交换L和R的值
  8. 重复循环,直到L和R指向同一个值
  9. 交换基准值与L的值

图示:

看图可知:

基准值的左边全部小于它
基准值的右边全部大于它

这说明这个基准值6
已经放在了数组中的正确位置!

我们只要不断递归左右子数组
最终这个数组就会变成有序!

单趟排序代码实现

//hoare
int PartSort1(vector<int>& f,int left,int right)
{
    int key = left;
    while (left < right)
    {    
        //右找小
        while (left<right&&f[right] >= f[key])
            right--;
        //左找大
        while (left<right&&f[left] <= f[key])
            left++;

        swap(f[left], f[right]);
    }
    swap(f[key], f[left]);
    return left;
}

注意:

内层循环注意加上left<right否则可能会越界

完整代码

//hoare
int PartSort1(vector<int>& f,int left,int right)
{
    int key = left;
    while (left < right)
    {    
        //右找小
        while (left<right&&f[right] >= f[key])
            right--;
        //左找大
        while (left<right&&f[left] <= f[key])
            left++;

        swap(f[left], f[right]);
    }
    swap(f[key], f[left]);
    return left;
}

void QuickSort(vector<int>& f, int begin, int end)
{
    if (begin >= end)
        return;
    int key = PartSort3(f, begin, end);
    QuickSort(f, begin, key - 1);
    QuickSort(f, key + 1, end);
}

缺陷及优化

缺陷:

当原数组已经有序时
再使用快排可能会导致栈溢出

因为R每次都走完了全部元素

一共要走:N+(N-1)+(N-2)+...+1次

时间复杂度:O(N^2)

优化:

三数取中法:

从最左,最右和中间的元素中
选取一个既不是最大也不是最小的
元素做基准值key.
选好后都将它与最左边的值交换
相当于还是用最左边做key.
即使原数组有序也不会影响到效率

代码实现:

原理就是取三个数的中间值然后与最左值交换,原理实现什么方法都是可以的

int GetMidIndex(vector<int>&f,int left,int right)
{
    int mid = (left + right) / 2;
    if (f[left] > f[mid])
    {
        if (f[mid] > f[right])
            return mid;
        else if (f[left] < f[right])
            return left;
        else
            return right;
    }
    else if (f[left] < f[mid])
    {
        if (f[mid] < f[right])
            return mid;
        else if (f[left] > f[right])
            return left;
        else
            return right;
    }
    return mid;
}

结语

第一种方法都这么叼了,那后面的方法是不是更厉害?

准确的来说,在效率上并不是,

但是hoare这个版本有坑,容易写错,

下两个版本会好理解,并且更容易实现

然而不管是hoare,挖坑,前后指针法
都是使用递归的手段解决问题
还有一种方法:
快排非递归法它可以解决栈溢出的问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MQTT.FX的使用

背景 在如今物联网的时代下&#xff0c;诞生了许多的物联网产品&#xff0c;这些产品通过BLE、WIFI、4G等各种各样的通信方式讲数据传输到各种各样的平台。 除了各个公司私有的云平台外&#xff0c;更多的初学者会接触到腾讯云、阿里云之类的平台。设备接入方式也有着多种多样…

react基础学习 JSX

JSX的测试网站 Babel Babel 可以测试代码的效果 JSX实现map列表 注意 key不一样&#xff08;使用遍历的时候&#xff09; 简单条件渲染 复杂条件渲染 绑定事件 function App() {const colorse (e)>{console.log("测试点击",e);}const colorse1 (name)>{…

数仓建模—指标体系指标拆解和选取

数仓建模—指标拆解和选取 第一节指标体系初识介绍了什么是指标体系 第二节指标体系分类分级和评价管理介绍了指标体系管理相关的,也就是指标体系的分级分类 这一节我们看一下指标体系的拆解和指标选取,这里我们先说指标选取,其实在整个企业的数字化建设过程中我们其实最…

vuInhub靶场实战系列-DC-6实战

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置二、信息收集2.1 主机发现2.1.1 nmap扫描存活主机2.1.2 arp-scan扫描存活主机 2.2 端口扫描2.3 指纹识别2.3.1 尝试指纹识别2.3.…

2024050302-重学 Java 设计模式《实战享元模式》

重学 Java 设计模式&#xff1a;实战享元模式「基于Redis秒杀&#xff0c;提供活动与库存信息查询场景」 一、前言 程序员&#x1f468;‍&#x1f4bb;‍的上下文是什么&#xff1f; 很多时候一大部分编程开发的人员都只是关注于功能的实现&#xff0c;只要自己把这部分需求…

现代控制中可控性的Gramian判据

知乎三角猫frank对于这块内容写的非常好&#xff0c;但这个输入的构造还是很难过于没头没尾 数学好的人&#xff0c;可能看一眼根据形式就能推出gramian的构造&#xff0c;但对我这种比较钻牛角尖的人&#xff0c;我就想有一个逻辑链条——gramian是怎么被构造出来的&#xff1…

eNSP学习——配置RIPv2认证

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建RIP网络 3、模拟网络攻击 4、配置RIPv2简单验证 5、配置RIPv2 MD5密文验证 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大全PD…

区块链游戏(链游)安全防御:抵御攻击的策略与实践

一、引言 区块链游戏&#xff0c;或称为链游&#xff0c;近年来随着区块链技术的普及而迅速崛起。然而&#xff0c;如同其他任何在线平台一样&#xff0c;链游也面临着各种安全威胁。本文将探讨链游可能遭遇的攻击类型以及如何通过有效的策略和技术手段进行防御。 二、链游可…

如何手动批准内核扩展 Tuxera NTFS for mac内核扩展需要批准 内核扩展怎么打开

在了解如何手动批准内核扩展之前&#xff0c;我们应该先了解什么叫做内核扩展。内核扩展又被称为KEXT&#xff0c;通过它可以实现macOS系统与软件组件之间的交互&#xff0c;例如磁盘管理、任务管理和内存管理等等。 kext 是内核扩展&#xff08;Kernel Extension&#xff09;…

[ue5]建模场景学习笔记(2)——用vectornoise降低重复率

1.问题分析&#xff1a; 利用改uv的方式降低重复率并不理想&#xff0c;在一定程度上的确能够达到降低重复率的效果&#xff0c;但远看仍然有较清晰的重复效果&#xff0c;尝试优化一下。 2.操作实现&#xff1a; 1.首先先看一下修改后的效果&#xff1a; 这是未修改前&#…

arco disign 封装数值范围组件

实现效果: 环境:vue3 arco disign vue a_input_number 实现代码: NumRange.vue <template> <span><a-input-numberv-model"minValue"style"width: 45%"v-bind"options"input"minInput"/><span:style"{…

Vue3中的常见组件通信之mitt

Vue3中的常见组件通信之mitt 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs…

JMeter的基本使用

JMeter的基本使用三步骤&#xff1a;1.添加线程、2.添加请求、3.添加查询结果的内容 如果需要添加token请求头来验证&#xff0c;则需要再加上一步骤&#xff1a;添加请求头 1.线程 添加线程的方式 主要修改者三个属性值 Number of Threads&#xff1a;并发线程数 Ramp-up…

转转回收业务策略中心的实践

1 背景 回收业务发展日益壮大&#xff0c;我们在邮寄、上门、门店三大履约模式下的业务逻辑日益复杂。同样都是在做回收这一个业务&#xff0c;即便履约方式不同&#xff0c;也有很多业务概念是一致的。为了避免各个业务闷头造轮子&#xff0c;同时又能拉齐三端的业务标准&…

王学岗鸿蒙开发(北向)——————(二)TS基本语法详解

1&#xff0c;Ts(TypeScript)语法相当于JAVAScript类型&#xff0c;鸿蒙arkTs是基于TS语言的,当然artTs也融合了其它的语言。 2&#xff0c;本篇文章是基于n9版本。注意,有些语法是已经不能用的。 3&#xff0c; 4&#xff0c;变量:用来存储数据,数字字母组成&#xff0c;数字不…

Java线程本地变量ThreadLocal

ThreadLocal ThreadLocal有什么用 通常情况下&#xff0c;我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢&#xff1f; JDK中的ThreadLocal类正是为了解决这样的问题&#xff0c;ThreadLocal类主要解决的就是让每…

关于yolov8识别滑块关键点

1&#xff0c;images,annotations创建 IMAGES&#xff1a;放图片材料的 ANNTATIONS&#xff1a;放labelImg标记的xml文件 2&#xff0c;labels,txt怎么来的 labels &#xff1a;可以手动创建&#xff0c;里面还配置了train,val,test文件夹。可手动&#xff08;以下代码中没有写…

【办公类-04-02】华为助手导出照片读取拍摄时间分类导出,视频不行)

背景需求 今天我用QQ相册导出照片&#xff0c;但是始终在转圈&#xff0c;手机上无法跳出“连结“”的提示&#xff0c;换了台式和笔记本都无法传输。&#xff08;明明5月14日还可以导出的&#xff09; 最后我只能用华为传输助手&#xff0c;把照片快速提取出来了。 使用原来…

Java--什么是方法

1.Java方法是语句的集合&#xff0c;它们在一起执行一个功能 1.方法是解决一类问题的步骤的有序组合 2.方法包含于类和对象中 3.方法在程序中被创建&#xff0c;在其他地方被引用 2.设计方法的原则&#xff1a;方法的本意是功能块&#xff0c;就是实现某个功能的语句块的集合&…

苹果宣布将对App Store条款进行一系列更新和改变

据了解&#xff0c;App Store将为开发者提供多项举措。包括开发者可以向用户介绍他们在iOS App之外的购买选项&#xff1b;增加开发者针对订阅、App内购买与付费App可提供的价格点数量&#xff1b;设立一项新基金&#xff0c;以协助符合资质的美国开发者等。 具体七项举措如下&…