手撕快速排序

定义

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法. 其基本思想为:任取待排序的某个元素作为基准值,按照该排序码将待排序集合分割成两个子序列, 左子序列中所有元素均小于基准值,右子序列均大于基准值,然后左右子序列重复该过程,知道所有元素都有序为止. (核心就是递归的思想,本质上它就是个递归...)

先不考虑如何找到划分的位置, 来看一下快速排序最核心的部分(递归)->

​
    //假设按照升序对array数组中[left, right)区间中的元素进行划分
    public void quickSort(int[] arr, int left, int right) {
        if(left - right >= 1) {
            return;
        }
        
        //按照基准值对array数组的[left, right)区间进行划分
        int div = partition(arr, left, right);
        
        //划分成功后以div为边界形成了左右两部分 -> [left, div), [div + 1, right)
        //递归排[left, div)
        quickSort(arr, left, div);
        
        //递归排[div + 1, right)
        quickSort(arr, div + 1, right);
    }

​

上述为快速排序递归实现的主框架, 通过代码, 我们发现:该过程与二叉树的前序遍历有异曲同工之处, 所以我们在写递归框架时可以想想二叉树的前序遍历规则即可快速写出来,后序只需要分析如何按照基准值来对区间中数据进行划分的方式即可.

两种方法

 将区间按照基准值划分为左右两半部分的常见方式有:

1.Hoare版

来看一下详细过程:

选取最左边的元素作为基准元素. 

 

右指针先向左移动,找到一个比基准值小的元素. 然后左指针向右移动,找到一个比基准值大的元素,等到两个都找到后,彼此交换.

 

重复上述过程.

 当左指针和右指针相遇时,交换相遇点与基准元素.

这样就分成了两部分.

让我们来看一下代码实现:

​
    private int partition(int[] arr, int left, int right) {
        int i = left, j = right;
        int pivot = arr[left];
        while (i < j) {
            while (i < j && arr[j] >= pivot) {
                j--;
            }
            while (i < j && arr[i] <= pivot) {
                i++;
            }
            swap(arr, i, j);
        }
        swap(arr, i, left);
        return i;
    }

​

2.挖坑法:

顾名思义:就是挖坑.  即先将第一个(最左边的数据)存放在临时变量中,这时最左边就成了"坑位", 然后移动右指针,找到一个比基准元素小的, 把它放到坑位中,此时右指针的位置就形成了一个"坑位",再移动左指针,找到一个比基准元素大的,放入右指针的"坑位中".重复上述过程即可, 直到左右指针重合.

    private int partition1(int[] arr, int left, int right) {
        int i = left, j = right;
        //确定一个基准值(第一个坑位)
        int pivot = arr[left];
        while(i < j) {
            while(i < j && arr[j] >= pivot) {
                j--;
            }
            //填左指针的坑(比基准元素小的)
            arr[i] = arr[j];
            while(i < j && arr[i] <= pivot) {
                i++;
            }
            //填右指针的坑(比基准元素大的)
            arr[j] = arr[i];
        }
        //将基准元素填入左右指针相遇的坑位
        arr[i] = pivot;
        return i;
    }

3.大声发:

 

快速排序总结

1.快速排序整体的综合性和使用场景都是比较好的,所以才敢叫快速排序.

2.时间复杂度O(N*LogN):这个东西可以类比为之前学过的归并排序,它们都是树形结构

3.空间复杂度:O(LogN)

4.稳定性:不稳定

注:快速方法有个致命的问题就是:数组越有序,时间复杂度越高,因为当它越有序时,按照之前的方法,就会把数组分成很小的小块,形成单枝的链表结构! 此时时间复杂度高达O(N^2)! 

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

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

相关文章

unity3d Animal Controller的Animal组件中General基础部分理解

控制器介绍 动物脚本负责控制动物的所有运动逻辑.它管理所有的动画师和刚体参数,以及所有的状态和模式,动物可以做。 动物控制器 是一个动画框架控制器,根动或到位,为任何生物或人形。它利用刚体与物理世界的互动和动画师的玩动画。 States States 是不互相重叠的动画。例如…

C++ 矩形类

思维导图&#xff1a; #include <iostream> using namespace std; class Rect { private:int width;int height; public:void init(int w,int h){widthw;heighth;}void set_w(int w){widthw;}void set_h(int h){heighth;}void show(){cout << "perimeter &qu…

vue3/vue2若依框架对比,点击新增编辑跳转到新页面(新增编辑共用代码)

vue2若依框架&#xff1a; router里面定义好&#xff0c;编辑里面添加一个id {path: /filmManagement,component: Layout,hidden: true,redirect: noredirect,children: [{path: editFilmDetail,component: () > import(/views/filmManagement/editFilmDetail),name: editFi…

城市级智能网联示范区全扫描(2024版)

本篇推出城市级智能网联示范区全扫描&#xff08;提供“城市级智能网联测试示范区汇总表”、“部委推进的城市级智能网联测试示范区汇总表”&#xff09;。 文 | 吴冬升 全文约5000字&#xff0c;预计阅读14分钟 表1 城市级智能网联测试示范区汇总表 区域省份城市名称华东上海…

《JAVA与模式》之单例模式

系列文章目录 文章目录 系列文章目录前言一、单例模式的结构二、Lazy initialization holder class模式前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在阎宏博士…

《JAVA与模式》之建造模式

系列文章目录 文章目录 系列文章目录前言一、产品的内部表象二、使用场景三、使用建造模式构建复杂对象前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在阎宏博士…

下一站,华东理工大学!

Datawhale线下 承办单位&#xff1a;华东理工大学创新创业协会 华东理工大学&#xff08;East China University of Science and Technology&#xff09;&#xff0c;简称华理&#xff08;ECUST&#xff09;&#xff0c;坐落于上海市&#xff0c;是中华人民共和国教育部直属的…

机器人大赛有什么用?

机器人大赛在多个方面都具有显著的价值。首先&#xff0c;机器人大赛可以为学生提供一个实践与创新的机会&#xff0c;有助于培养学生的动手实践能力和创新思维。在比赛过程中&#xff0c;学生需要运用所学的知识和技能&#xff0c;设计、制作和调试机器人&#xff0c;这不仅可…

【前端寻宝之路】学习和总结文本和图片位置和类型设置

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-YaQjeEzlBXrYuFKV {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

【EDK II】作为UEFI的实现,EDK II 的架构是什么样的

目录 前言 EDK II 架构 配置文件 结语 前言 基本输入输出系统 (Basic Input Output System, BIOS) 最早由 IBM&#xff08;International Business Machines Corporation) 公司于1981年提出并开发&#xff0c;后来成为个人计算机(PC)的标准固件接口。但受限于传统BIOS (Le…

力扣串题:字符串中的第一个唯一字母

映射做法&#xff1a;将字母转为数字之类的转化必须在运算中实现如-a int firstUniqChar(char * s){int a[26] {0};int len strlen(s);int i;for (i 0; i < len; i)a[s[i] - a];for (i 0; i < len; i) {if (a[s[i] - a] 1)return i;}return -1; }

聚观早报 | 比亚迪e2荣耀版上市;华为享界S9正式亮相

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月14日消息 比亚迪e2荣耀版上市 华为享界S9正式亮相 理想汽车L系列改名 极氪全新纯电MPV车型曝光 vivo X100S外…

一键导入Figma,让团队文件管理更加便捷安全!

如何将Figma引入国内软件已成为人们关注的话题。本文将分享两种Figma导入方法&#xff0c;使您的设计文件更加安全。 两种方法&#xff0c;一键导入Figma文件 即时设计是一种基于云的设计工具&#xff0c;在功能和特性上与Figma非常相似。如果你熟悉Figma的界面&#xff0c;即…

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&…

RAG一文读懂!概念、场景、优势、对比微调与项目代码示例

本文结合“基于 ERNIE SDKLangChain 搭建个人知识库”的代码示例&#xff0c;为您讲解 RAG 的相关概念。 01 概念 在2020年 Facebook AI Research(FAIR)团队发表一篇名为《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》的论文。这篇论文首次提出了 RA…

Midjourney绘图欣赏系列(九)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

行业认可 | 海云安上榜《2024年网络与信息安全行业全景图》多个领域

近日&#xff0c;深圳市网络与信息安全行业协会正式发布《2024年网络与信息安全行业全景图》。海云安凭借过硬的技术实力及成熟的网络与信息安全产品及服务获得行业认可&#xff0c;入围6大类目共计17项细分领域。包括&#xff1a; 业务安全&#xff08;软硬件开发安全、人工智…

《vtk9 book》 官方web版 第3章 - 计算机图形基础 (5 / 5)

vtkProp的组件和其他类型 通常希望将演员收集到一个依赖于变换的层次结构中。例如&#xff0c;一个机器人手臂可以由刚性连接的链接表示&#xff0c;这些链接在肩关节、上臂、肘部、下臂、腕关节和手部等关节处连接在一起。在这种配置中&#xff0c;当肩关节旋转时&#xff0c;…

[C++]20.实现红黑树。

实现红黑树 一.基本概念&#xff1a;1.红黑树的概念&#xff1a;2.红黑树的性质&#xff1a; 二.实现红黑树&#xff1a;1.基本结构&#xff1a;2.插入节点的多种情况&#xff1a;1.叔叔存在且为红&#xff1a;2.叔叔不存在/存在且为黑(单旋变色)3.叔叔不存在/存在且为黑(多旋&…

Wi-Fi 6E简介:扩展Wi-Fi的频谱资源

一、Wi-Fi 6E是什么&#xff1f; Wi-Fi 6E是Wi-Fi 6的一个增强版本&#xff0c;其中的“E”代表“Extended”。它采用了相同的技术标准&#xff0c;但使用了更高的频段。Wi-Fi 6E在5 GHz频段之外引入了新的6 GHz频段&#xff0c;为用户提供了更多的可用频谱&#xff0c;以便提…
最新文章