排序之快速排序

代码
class Solution {
    public int[] sortArray(int[] nums) {
        merge(nums, 0, nums.length - 1);
        return nums;
    }
    private void merge(int[] nums, int l, int r){
        if(l >= r) return;
        // 随机选取主元
        int i = new Random().nextInt(r - l + 1) + l;
        int temp = nums[i];
        nums[i] = nums[l];
        nums[l] = temp;
        int idx = sort(nums, l, r);
        merge(nums, l, idx - 1);
        merge(nums, idx + 1, r);
    }
    private int sort(int[] nums, int l, int r){
        int tmp = nums[l];
        int i = l;
        int j = r;
        while(i != j){
            while(nums[j] >= tmp && i < j){
                j--;
            }
            while(nums[i] <= tmp && i < j){
                i++;
            }
            if(i < j){
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            }
        }
        nums[l] = nums[i];
        nums[i] = tmp;
        return i;
    }
}
过程

        先给出一个待排序的数组
请添加图片描述
        上述代码有两个主要方法,merge和sort方法,首先进入的是merge方法,进入merge方法,if条件,l为0,r为nums.length-1,不满足条件,暂时不用看随机主元选取的下面四行代码,之后进入了sort方法,l为0,r为nums.length - 1。sort方法,首先将首个元素4的值赋值给了tmp,i为首元素下标,j为末尾元素下标。进入i!=j,进入while循环,内层第一个while循环查找比tmp小的元素对应的下标,第二个while循环查找比tmp大的元素的下标,显然,经过第一个while后,j指向元素5的下标,i指向元素3的下标,之后进入if判断,i<j,满足条件,交换下标i和下标j的元素,得到如下图所示结果。
请添加图片描述
        第一次最外层while循环结束,此时,i指向3元素所在下标,j指向5元素所在下标,i!=j,继续。内层第一个while循环继续从5开始找比tmp(4)小的元素,j走到元素为1的下标位置,然后内层第二个while循环继续从3开始找比tmp(4)小的元素,走到下标1时,就停止了,原因在于while循环的第二个条件是i<j,此时i=j。走到if判断,i < j,显然i=j不满足条件。第二次外层循环结束,i=j,跳出最外层循环。此时,i和j都指向了元素1的下标。将nums[l]=nums[i],将元素为4修改为1,nums[i]=tmp,将元素为1修改为4。
        需要注意的是,内层两个循环不能调换顺序,如果调换顺序,就如上图所示,先从3开始找比tmp(4)大的元素,i会停在7的位置,之后从5开始找比tmp小的元素,但是由于要满足i<j,j也会停在7的位置,这就会导致跳出循环后,将元素4和元素7的位置进行调换,sort方法无法使得左侧序列都小于tmp,右侧序列都大于tmp。
请添加图片描述
        sort方法结束,返回元素4所在的下标,经过一次sort方法,得到了左侧小于4的序列,和右侧大于4的序列。sort方法的作用就是将数组首元素放到排序后数组的正确位置。之后分别递归左右两侧,即[1,2,3]和[7,6,5]继续使用sort方法,看右侧,将7排序到正确位置,并返回对应下标,显然[7, 6, 5]整个序列进入sort方法后,内层第一个while循环找比7小的元素,j指向了末尾元素5的位置,第二个while循环,找比7大的元素,i最终会走到元素5的下标,if条件也不会满足。将nums[l] = nums[i],nums[i]=tmp,得到序列[5, 6, 7],返回元素7下标,递归7左侧[5,6],和右侧[],显然右侧递归进入下一个merge方法因为l>r(l为5的下标,r为7的下标,递归返回7的下标,就是r,进入mergel和r分别传入7的下标+1,7的下标,l肯定大于r)而递归停止。左侧[5,6],进入sort方法,第一个while循环,j从6开始找比5小的元素,j就走到元素5所在的下标,第二个while循环,i<j不满足这个条件,也不满足if条件,i还是指向元素5,最后nums[l]=num[i],nums[i]=tmp,l和i下标其实是一样的,都指向了5。sort方法结束,返回5所在下标,5左侧[],右侧[6],继续递归merge方法,左侧因为l>r(l为5的下标,r为6的下标,返回5的下标,进入mergel和r分别传入5的下标,和5的下标-1,l肯定大于r),右侧因为l==r(l为5的下标,r为6的下标,返回5的下标,进入mergel和r分别传入5的下标+1,和6的下标,l等于r),而导致递归停止。
        在merge方法中,进入sort方法之前,有一个随机主元操作,如果没有该四行代码,sort默认将数组首元素作为主元,将数组排序成左侧小于数组首元素,右侧大于数组首元素。上述四行代码则是随机从数组中选取一个元素作为主元,而不是一直都是默认数组首元素。

实战
  • 排序数组

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

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

相关文章

探索ElasticSearch高级特性:从映射到智能搜索

欢迎关注我的公众号“知其然亦知其所以然”,获取更多技术干货! 大家好,我是小米!今天我们来聊聊阿里巴巴面试题中的一个高级话题:ElasticSearch(以下简称ES)的高级特性。ES作为一款强大的搜索引擎,在处理大规模数据和复杂查询时发挥着重要作用。而了解其高级特性,则是…

微服务-6 Gateway网关

一、网关搭建 此时浏览器访问 localhost:10010/user/list 后正常返回数据&#xff0c;说明网关已生效&#xff0c;其原理流程图如下&#xff1a; 二、网关过滤器 作用&#xff1a;处理一切进入网关的请求和微服务响应。 1. 网关过滤器的分类&#xff1a; a. 某个路由的过滤器 …

购物车实现

目录 1.购物车常见的实现方式 2.购物车数据结构介绍 3.实例分析 1.controller层 2.service层 1.购物车常见的实现方式 方式一&#xff1a;存储到数据库 性能存在瓶颈方式二&#xff1a;前端本地存储 localstorage在浏览器中存储 key/value 对&#xff0c;没有过期时间。s…

Linux中使用Alias技术实现虚拟网卡

背景 在《Linux中虚拟网络技术有哪些》一文中&#xff0c;我们介绍了多种创建虚拟网卡的方法。本文介绍使用Alias技术创建虚拟网卡。 分析 Alias技术 在计算机领域中&#xff0c;Alias技术指的是给一个实体&#xff08;如文件、命令、网络接口等&#xff09;起一个别名或替代…

【leetcode】 跳跃游戏 IV

跳跃游戏IV 题目思路代码 题目 给你一个整数数组 arr &#xff0c;你一开始在数组的第一个元素处&#xff08;下标为 0&#xff09;。每一步&#xff0c;你可以从下标 i 跳到下标 i 1 、i - 1 或者 j &#xff1a;i 1 需满足&#xff1a;i 1 < arr.length i - 1 需满足&…

C++静态库与动态库

什么是库 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载…

Linux中磁盘的分区,格式化,挂载和文件系统的修复

一.分区工具 1.分区工具介绍 fdisk 2t及以下分区 推荐 (分完区不保存不生效&#xff0c;有反悔的可能) gdisk 全支持 推荐 parted 全支持 不推荐 ( 即时生效&#xff0c;分完立即生效) 2.fdisk 分区,查看磁盘 格式:fdisk -l [磁盘设备] fdisk -l 查看…

运动听歌哪款耳机靠谱?精选五款热门开放式耳机

随着人们对运动健康的重视&#xff0c;越来越多的运动爱好者开始关注如何在运动中享受音乐。开放式蓝牙耳机凭借其独特的设计&#xff0c;成为了户外运动的理想选择。它不仅让你在运动时能够清晰听到周围环境的声音&#xff0c;保持警觉&#xff0c;还能让你在需要时与他人轻松…

【数据结构】常见的排序算法

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…

基于单链表实现通讯管理系统!(有完整源码!)

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;C语言实战项目 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、前言 友友们&#xff0c;这篇文章是基于单链…

解决window10 utf-8编码软件中文全部乱码问题

问题描述 很多软件都是乱码状态&#xff0c;不管是Keil还是ISP或者是其他的一些非知名软件&#xff0c;都出现了中文乱码&#xff0c;英文正常显示问题&#xff0c;这个时候是系统出了问题。 解决方法 打开控制面板 点击更改日期、时间或数字格式 点击管理和更改系统区域…

华为云配置安全组策略开放端口

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

mysql 查询实战-变量方式-解答

对mysql 查询实战-变量方式-题目&#xff0c;进行一个解答。&#xff08;先看题&#xff0c;先做&#xff0c;再看解答&#xff09; 1、查询表中⾄少连续三次的数字 1&#xff0c;处理思路 要计算连续出现的数字&#xff0c;加个前置变量&#xff0c;记录上一个的值&#xff0c…

类和对象(拷贝构造函数)

目录 拷贝构造函数 特征 结论&#xff1a; 拷贝构造函数 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存 在的类类型对象创建新对象时由编译器自动调用。 特征 拷贝构造函数也是特殊的成员函数&…

SQL注入sqli_labs靶场第十一、十二、十三、十四题详解

第十一题 方法一 poss提交 输入1显示登录失败 输入1 显示报错信息 根据提示得知&#xff1a;SQL查询语句为 username参数 and password and是与运算&#xff1b;两个或多个条件同时满足&#xff0c;才为真&#xff08;显示一条数据&#xff09; or是或运算&#xff0c;两个…

itext7 pdf转图片

https://github.com/thombrink/itext7.pdfimage 新建asp.net core8项目&#xff0c;安装itext7和system.drawing.common 引入itext.pdfimage核心代码 imageListener下有一段不安全的代码 unsafe{for (int y 0; y < image.Height; y){byte* ptrMask (byte*)bitsMask.Scan…

B站大数据平台元数据业务分享

背景介绍 元数据是数据平台的衍生数据&#xff0c;比如调度任务信息&#xff0c;离线hive表&#xff0c;实时topic&#xff0c;字段信息&#xff0c;存储信息&#xff0c;质量信息&#xff0c;热度信息等。在数据平台建设初期&#xff0c;这类数据主要散落于各种平台子系统的数…

STM32H7的Cache学习和应用

STM32H7的Cache学习和应用 啥是Cache&#xff1f;Cache的配置配置 Non-cacheable配置 Write through&#xff0c;read allocate&#xff0c;no write allocate配置 Write back&#xff0c;read allocate&#xff0c;no write allocate配置 Write back&#xff0c;read allocate…

05 SQL进阶 -- 复杂查询方法 -- 视图与子查询

1. 视图 我们先来看一个查询语句 SELECT stu_name FROM view_students_info; 单从表面上看起来这个语句是和正常的从数据表中查询数据是完全相同的,但其实我们操作的是一个视图。所以从SQL的角度来说操作视图与操作表看起来是完全相同的,那么为什么还会有视图的存在呢?视…

002nodejs详细安装步骤和npm配置

1、Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。Node.js 使用高效、轻量级的事件驱动、非阻塞 I/O 模型。它的包生态系统&#xff0c;npm&#xff0c;是目前世界上最大的开源库生态系统。 2、下载Node.js 官方地址&#xff1a;https://nodejs.org/…