快速排序(Java)

news2024/11/24 6:02:16

基本思想

快速排序Quicksort)是对冒泡排序的一种改进。 基本思想是分治的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序算法的平均时间复杂度O(nlogn)

快速排序法示意图:

image-20220721132451428

代码实现

思路:**左右双指针移动 **

例(从小到大排序下面的数组元素)

在这里插入图片描述

  1. 选择最右侧数值作为基准(pivot),并将该位置作为坑;左指针(left)指向最左侧数字,右指针(right)指向最右侧数字
    在这里插入图片描述

  2. 左指针向右移动。当左指针与右指针相遇(指向同一数字)时停下来,或者左指针指向数字大于pivot时也停下来,将该值填入坑中,将坑改为此位置
    在这里插入图片描述

  3. 右指针向左移动。左指针与右指针相遇时停下来,或者右指针指向数字小于pivot时也停下来,将该值填入坑中,将坑改为此位置
    在这里插入图片描述

  4. 循环2、3步直至两指针相遇。如果此时左指针与右指针相遇,此时该位置为坑,将pivot填入该坑中,这样pivot的位置就找好了。
    在这里插入图片描述

  5. 递归(以上步骤)基准左、右两旁的数列,直至数列不可再分则完成排序

备注:

  1. 递归的出口必须仔细考虑清楚,否则就会陷入无穷循环从而使栈溢出;
  2. 这里如果pivot 选在左侧,就要先从右侧开始遍历,反之则先从左侧开始
  3. 记得考虑到数值相同的情况

代码落地

public static void quickSort(int[] arr,int startIndex, int endIndex) {
    if (startIndex >= endIndex) {
        return;
    }
    int left = startIndex, right = endIndex, pivot = arr[endIndex];
    while (left < right) {
        while (left < right && arr[left] <= pivot) {
            left++;
        }
        arr[right] = arr[left];
        while (left < right && arr[right] >= pivot) {
            right--;
        }
        arr[left] = arr[right];
    }
    arr[left] = pivot;
    quickSort(arr, startIndex, left - 1);
    quickSort(arr, left + 1, endIndex);
}

参考文章

快速排序法(详解)

五分钟学会一个高难度算法:快速排序

排序算法之快速排序(Java实现)

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

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

相关文章

高等数学教材重难点题型总结(十)重积分

第十章错题整理&#xff0c;公式由于多元函数的引入看起来唬人而已&#xff0c;其实熟练掌握一元函数的积分后不算什么难事。重点在于计算时不要犯细节错误。此外&#xff0c;对于不同坐标系下的积分方式要重点关注~ 1.利用性质估计二重积分的值 2.计算直角坐标系下的二重积分 …

行情分析——加密货币市场大盘走势(11.4)

大饼昨日下跌过后开始有回调的迹象&#xff0c;现在还是在做指标修复&#xff0c;大饼的策略保持逢低做多。稳健的依然是不碰。 以太昨日给的策略&#xff0c;已经止盈了&#xff0c;现在已经达到1835&#xff0c;接下来就是等待即可&#xff0c;还会继续上涨的&#xff0c;当然…

JavaEE平台技术——预备知识(Maven、Docker)

JavaEE平台技术——预备知识&#xff08;Maven、Docker&#xff09; 1. Maven2. Docker 在观看这个之前&#xff0c;大家请查阅前序内容。 &#x1f600;JavaEE的渊源 &#x1f600;&#x1f600;JavaEE平台技术——预备知识&#xff08;Web、Sevlet、Tomcat&#xff09; 1. M…

【C++入门】类和对象(一)

目录 前言 1. 面向对象和面向过程 2. 类的引入 3. 类的定义 3.1 类的定义方法 4. 类的访问限定符和封装 4.1 访问限定符 4.2 封装 5. 类的作用域 6. 类的实例化 7. 类对象模型 7.1 类对象的大小 8. this指针 前言 在初学C语言时&#xff0c;想必大家都听说过 “ 面向过…

基于STC12C5A60S2系列1T 8051单片机EEPROM应用

基于STC12C5A60S2系列1T 8051单片机EEPROM应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍STC12C5A60S2系列1T 8051单片机EEPROM介绍基于STC12C5A60S2系列1T 8051单…

02 线性组合、张成的空间与基

线性组合、张成的空间与基 基向量缩放向量并相加给定向量张成的空间线性相关与线性无关空间的基 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 基向量 当看到一对描述向量的数时&#xff0c;比如[3,-2]时&#xff0c;把这对数中的每个数&#xff08;坐标&…

Android性能优化--Perfetto用SQL性能分析

Android性能优化–Perfetto用SQL性能分析 文章目录 Android性能优化--Perfetto用SQL性能分析介绍Perfetto SQL 基础使用 Perfetto SQL 进行性能分析总结 本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134167741 最新更新地址 https://gitee.com/chenjim/che…

Git从基础到实践

1.Git是用来做什么的&#xff1f; git就是一款版本控制软件&#xff0c;主要面向代码的管理。你可以理解为Git是一个代码的备份器&#xff0c;给你的每一次修改后的代码做个备份&#xff0c;防止丢失&#xff0c;这个是git最基本的功能。 其次,git不止备份,当你需要比对多…

隔离和非隔离电源的区别

一、电源隔离与非隔离 电源的隔离与非隔离&#xff0c;主要是针对开关电源而言&#xff0c;业内比较通用的看法是&#xff1a; 1、隔离电源&#xff1a;电源的输入回路和输出回路之间没有直接的电气连接&#xff0c;输入和输出之间是绝缘的高阻态&#xff0c;没有电流回路。 …

性格孤僻的人怎么改变自己?

性格孤僻&#xff0c;说的是寡言少语&#xff0c;不合群&#xff0c;不能与人保持正常关系、经常离群索居的心理状态。这里只是说性格&#xff0c;不涉及心理疾病&#xff0c;只说这是一种性格特征。性格孤僻的人不一定有心理疾病&#xff0c;但是长期的性格孤僻确实容易导致产…

VueI18n中英文切换 vue2.0

1: npm install --save vue-i18n8.0.0 &#xff08;版本不要高了&#xff0c;不然报错&#xff09; 2&#xff1a;创建相关文件 3&#xff1a;main.js文件配置 //i18n插件 import VueI18n from vue-i18n // element-ui多语言文件 import locale from element-ui/lib/locale;…

旋转图像[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个n n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a; matrix…

perl列表创建、追加、删除

简介 perl 列表追加元素 主要是通过push和unshift函数来实现。其中&#xff0c;push是追加到列表尾&#xff0c;unshift是追加到列表头。 perl列表删除元素 主要是通过pop和shift函数来实现。其中&#xff0c;pop是从列表尾删除一个元素&#xff0c; shift是从列表头删除一…

以配置的方式开关axios拦截器功能

前景提要&#xff1a; ts 简易封装 axios&#xff0c;统一 API 背景 axios 很多额外功能都是基于拦截器实现。有些功能想要全局使用&#xff0c;因此将拦截器注册在全局。比如重复请求过滤。但也有一小部分请求不希望进行过滤&#xff0c;比如并发上传文件。 因此希望可以在…

贰[2],OpenCV函数解析

1&#xff0c;imread&#xff1a;图片读取 CV_EXPORTS_W Mat imread( const String& filename, int flags IMREAD_COLOR );//参数1(filename)&#xff1a;文件地址 //参数2(flags):读取标志 注:ImreadModes&#xff0c;参数2(flags)枚举定义 enum ImreadModes { IMREAD…

SOEM源码解析——ec_init(初始化单网卡主站)

0 工具准备 1.SOEM-master-1.4.0源码1 ec_init总览 /** Initialise lib in single NIC mode:初始化库在单网卡模式* param[in] ifname Dev name, f.e. "eth0" 设备名* return >0 if OK* see ecx_init*/ int ec_init(const char * ifname) {return ecx_init(&…

构建高性能嵌入式系统的技术要求

目录 关键的技术要求 硬件设计 嵌入式操作系统&#xff08;Embedded Operating System&#xff09; 内存管理 电源管理 通信接口 实时性能 软件优化 安全性 关键的技术要求 硬件设计&#xff1a; 处理器选择&#xff1a; 选择适当的处理器架构&#xff0c;考虑性能、功…

点大商城V2版 2.5.2.1 全开源独立版 多小程序端+unipp安装教程

点大商城V2是一款采用全新界面设计支持多端覆盖的小程序应用&#xff0c;支持H5、微信公众号、微信小程序、头条小程序、支付宝小程序、百度小程序&#xff0c;本程序是点大商城V2独立版&#xff0c;包含全部插件&#xff0c;代码全开源&#xff0c;并且有VUE全端代码。分销&am…

MMDetection 系列(一): 初步入门配置文件

参考文档 不得不知的 MMDetection 学习路线(个人经验版) 轻松掌握 MMDetection 整体构建流程(一) 学习配置文件 MaskRCNN 配置文件的逻辑 整体来说&#xff0c;配置文件包含以下几个部分&#xff1a; 数据集和评测器配置模型配置训练和测试的配置优化相关配置钩子配置(TODO…

Web测试与APP测试详解

前言 单纯从功能测试的层面上来讲的话&#xff0c;App 测试、Web 测试在流程和功能测试上是没有区别的&#xff0c;但由于系统结构方面存在差异&#xff08;web 项目&#xff0c;b/s 架构&#xff1b;app 项目&#xff0c;c/s 结构&#xff09;在测试中还是有不同的侧重点内容…