【算法】快速排序

JavaScript实现快速排序算法 JavaScript实现经典排序算法—快排 快速排序算法的性能比之前的冒泡、选择排序都要好,和归并排序一样,是一个可以用于实战的算法,听说chrome用的就是快排 又听说前端面试会考,那你实现一个快排吧! 一、快速排序的算法思路 还是在这里看一下快排是啥意思 快速排序算法动图 1、快速排序的特点就是随机设置一个基准点,比如是数组的第一个元素,然后数组的其他元素就跟这个基准线进行对比,比基准线大的放在左边,比基准线小的放在右边 2、再设置一个基准线,再这样小的放左边,大的放右边,递归。 二、编码实现 详细分析 阅读详情

1、 快速排序

快速排序(QuickSort)是一种基于分治思想的高效的排序算法,由英国计算机科学家 Tony Hoare 在 1961 年发明。它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,然后再对这两部分记录分别进行快速排序,以达到整个序列有序的目的。

时间复杂度:

  • 最优情况:O(nlogn)
  • 最坏情况:O(n^2)
  • 平均情况:O(nlogn)

空间复杂度:快速排序是一种原地排序算法,不需要额外的内存空间,因此空间复杂度为 O(1)。

1.1 代码实现:

标准快排

    public static void quickSort(int[] arr, int left, int right) {
        if (left < right) {
            int p = partition1(arr, left, right); // 获取分区节点
            quickSort(arr, left, p - 1); // 对左子数组进行排序
            quickSort(arr, p + 1, right); // 对右子数组进行排序
        }
    }
    
    /**
     * 标准快排
     */
    public static int partition1(int[] arr, int left, int right) {
        for (int j = left; j < right; j++) {
            if (arr[j] < arr[right]) {
                SortUtils.swap(arr, left++, j);
            }
        }
        SortUtils.swap(arr, left, right);
        return left;
    }

快排2.0

每次排序筛选掉等于分区节点的部分,减少后续递归的数量

public static void quickSort2(int[] arr, int left, int right) {
        if (left < right) {
            int[] p = partition2(arr, left, right); // 获取分区节点
            quickSort2(arr, left, p[0] - 1); // 对左子数组进行排序
            quickSort2(arr, p[1] + 1, right); // 对右子数组进行排序
        }
    }
    
    public static int[] partition2(int[] arr, int left, int right) {
        int less = left - 1; // 小于分区点的左边界
        int more = right; // 小于分区点的右边界
        while (left < more) {
            if (arr[left] < arr[right]) {
                SortUtils.swap(arr, left++, ++less);
            } else if (arr[left] > arr[right]) {
                SortUtils.swap(arr, left, --more);
            } else {
                left++;
            }
        }
        SortUtils.swap(arr, more, right);
        return new int[]{less + 1, more};
    }

快排3.0

因为分区点的选取会导致快排的不稳定,原始版本中每次从分组的右边界选择分区点,如果数组已经有序,分区点会导致分区不均衡,从而不能发挥快排的优势。随机选取分区点可以有效避免这种情况。在随机选取的情况下,分区点的位置是随机的,使得快速排序的每次划分都有一定的随机性,在最坏情况下的时间复杂度和空间复杂度都得到了保证

    public static void quickSort3(int[] arr, int left, int right) {
        if (left < right) {
            SortUtils.swap(arr, left + (int) (Math.random() * (right - left + 1)), right);
            int[] p = partition2(arr, left, right); // 获取分区节点
            quickSort2(arr, left, p[0] - 1); // 对左子数组进行排序
            quickSort2(arr, p[1] + 1, right); // 对右子数组进行排序
        }
    }
    
    public static int[] partition3(int[] arr, int left, int right) {
        int less = left - 1; // 小于分区点的左边界
        int more = right; // 小于分区点的右边界
        while (left < more) {
            if (arr[left] < arr[right]) {
                SortUtils.swap(arr, left++, ++less);
            } else if (arr[left] > arr[right]) {
                SortUtils.swap(arr, left, --more);
            } else {
                left++;
            }
        }
        SortUtils.swap(arr, more, right);
        return new int[]{less + 1, more};
    }
Opencv4.5.1 微信二维码识别功能 QRCode 编译与使用 C++ 部分参考:https://mp.weixin.qq.com/s/2GZAJAUPHTXFOKDRv-D21Q 一、下载源码 https://github.com/opencv 二、源码编译 ① 在cmake中添加源码编译路径和生成路径,第一次点击configure。 ② 添加contrib路径 第一次configure后,找到OPENCV_EXTRA_MODULES_PATH,将contrib路径添加进来,注意要具体到modules/,继续configure。 .. 阅读详情

相关推荐

DDR4 硬件设计笔记

DDR4-DRAM是第四代支持双倍数据读取,支持随机位置存取的静态存储器。DDR4-DRAM的工作原理。DDR之T拓扑和Fly-by拓扑。DDR的硬件设计。DDR4 PCB设计要点介绍。DDR4之PCB走线间距的串扰评估。DDR4之内存通道(channel)和内存列(rank)。

qq_26815321的博客 1万+

快速排序算法

最开始学习编程,遇到排序问题,一般都是用冒泡法,因为冒泡法好理解,代码量少。但是这种算法时间复杂度高,当需要排序的元素较多时,程序运行时间很长,因此产生了快速排序算法。该算法的实现可分为以下几步: 1. 在数组中选一个基准数(通常为数组第一个); 2. 将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边; 3. 对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个...

elma_tww的博客 23万+

【ZYNQ驱动双AD9361实战】(一)从官方参考设计到自定义移植

本文详细介绍了如何将ADI官方的单AD9361参考设计移植到ZYNQ平台以驱动双AD9361射频板卡。内容涵盖从环境搭建、官方工程架构解析,到硬件HDL工程修改(包括顶层设计、引脚分配及TCL脚本适配)以及Linux设备树软件配置的全流程实战指南,帮助开发者实现自定义双通道射频收发系统。

weixin_29170327的博客 362

快速排序算法原理

1.快速排序算法是什么? 想必大家都学过和用过冒泡排序吧!这应该是大家成为程序员道路上学的第一个算法哦,那么我们的快速排序算法其实是在冒泡排序的基础上的一个改进,快速排序算法是利用一趟快速排序,一趟快排一般都是取第一个数作为准基数进行排序,将一串数据分成两个部分, 第一部分都比准基数小,第二部分都比准基数大,如:(-------第一部分------准基数------第二部分),也就这样以准...

Mr_xiayijie的博客 1万+

AI代码标注专家Prompt指令的最佳实践

AI代码标注专家 Prompt 可作为项目级别提示词使用,专门负责为 AI 生成的代码添加特定的注释标记,然后基于 Node 脚本可以初步统计出 AI 代码占比。

💻 Code:TypeScript / Engineering 🤖 AI:Prompt Optimization / Context Memory / Coding Agents 615

FI 应计对象的创建和摊销

创建/修改:ACACTREE01/ACACTREE02 应计对象的过账:ACACPOSTING

nancyln9711的博客 903

快速排序: 使用快速排序算法对数组进行排序

快速排序: 使用快速排序算法对数组进行排序 题目 一个数组有 N 个元素,使用快速排序对其进行排序输出(本题还会人工阅卷,请使用快速排序算法进行排序) 输入描述: 输入为两行。 第一行一个整数n(1 ≤ n ≤ 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。 输出描述: 输出一行,即排序之后的数组,以空格分隔,行末无空格 示列 输入 1...

huigui65的博客 1万+

【VxWorks】Vxworks、QNX、Xenomai、Intime、Sylixos、Ucos等实时操作系统的性能特点

VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统,是嵌入式开发环境的关键组成部分。其内核支持多任务调度(采用基于优先级抢占方式,同时支持同优先级任务间的分时间片调度)、任务间的同步、进程间通信机制、中断处理、定时器和内存管理机制等,且提供了一个快速灵活的与 ANSIC 兼容的 I/O 系统,网络支持 对其它VxWorks系统和TCP/IP网络系统的"透明"访问。具有良好的持续发展能力、良好的可靠性、卓越的实时性和高性能的内核以及友好的用户开发环境。

smartvxworks的博客 1064

快速排序算法详解

前言 什么是快速排序? 这是我之前遇到的一个面试题,当时没回答来,我只写过冒泡排序、选择排序、插入排序呀,啥是快速排序,委屈巴巴, 一首凉凉送我自己。 1. 什么是快速排序算法? 快速排序算法是对冒泡排序算法的一种改进,没有两两相邻之间的比较换位,主要采用的思想是通过递归+独立排序的形式将无序的数列进行分割成可以独立排序的2部分数列,其中一部分数列比另外一部书数列小,每次排序两个独立的数列,直到排序完毕,即可完成最终的排序, 在算法时间复杂度上比冒泡排序小很多。 ...

Dream_it_possible!的博客 4401

深入浅出块I/O子系统(四)请求处理过程

BIO请求处理的流程 函数scsi_request_fn()代码(摘自文件drivers/scsi/scsi_lib.c) (1)static void scsi_request_fn(struct request_queue *q) (2)int scsi_dispatch_cmd(struct scsi_cmnd *cmd) { host->hostt->queuecommand(host, cmd) } (3)struct sas_internal *i sas_queuec

sinat_37817094的博客 1348

PyTorch实战(25)——使用PyTorch构建DQN模型

深度Q网络 (Deep Q-learning Network, DQN) 在强化学习领域取得了巨大的成功和广泛的应用,PyTorch 结合 gymnasium 库为我们提供了强大的工具,支持在各种强化学习环境中测试不同类型的深度强化学习模型。在本节中,我们使用 PyTorch 框架构建使用卷积神经网络架构的 DQN 模型,模型通过自主学习掌握 Atari 经典游戏《Pong》的操作策略,最终实现击败电脑对手的竞技目标。

盼小辉丶的博客 3447

快速排序算法原理与实现

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。    假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它

起跑线的专栏 6万+

京东豆自动领取脚本配置教程

腾讯云/阿里云服务器(Docker环境):全自动跑脚本领京豆(无需本地代理,使用加速源)

AIOT魔法师 859

C# 快速排序算法的详细讲解

C# 快速排序算法的详细讲解

菌菌兹的博客 1796

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

快速排序算法和Sherwood 快速排序算法

比较快速排序算法和Sherwood 快速排序算法中比较的次数 问题描述 输入数据集 { 8,18, 2,16, 6,4,40, 3,5,7,1,9 , 22 ,11,13,10,20} A.显示输出快速排序中的比较次数和Sherwood中比较的次数,及排序结果。注:第一个元素选最后一个。 B.显示奇数项(下标从0开始,)降序排列,偶数项按升序排列的排列结果。 代码实现 对于题目A:显示输出快速排序中的比较次数和Sherwood中比较的次数,及排序结果。注:第一个元素选最后一个。 代码如下: //A.显示输出

m0_51139840的博客 663

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

快速排序算法与舍伍德快速排序算法

排序算法是比较常见的算法,道理也比较简单,双指针法。今天被朋友问了个舍伍德排序算法,也是快速排序那种形式。尴尬,第一次听说,特意学了一下。结合快速排序,写了三个方法。 第一种: //不需要将基准值归位的快速排序 public static void quickSort(int []a,int left,int right) { if(left>=right) return ; int ...

大鹏视界U 3834

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JavaScript算法——快速排序

一、概念 快速排序算法由 C. A. R. Hoare 在 1960 年提出。它的时间复杂度也是 O(nlogn),但它在时间复杂度为 O(nlogn) 级的几种排序算法中,大多数情况下效率更高,所以快速排序的应用非常广泛。 注意: 快速排序不一定是最快的排序方法,这取决于需要排序的数据结构、数据量。不过,大多数情况下,面试官和工作场所用它的概率也是相对较高的,所以我们应该花时间把它学透彻。 二、工作原理 首先设定一个分界值,通过该分界值将数组分成左右两部分。 将大于或等于分界值的数据集中到数组右边

诸葛韩信--一个前往前端不归路的浪子 6948

快速排序算法_排序算法Java实现快速排序算法

点击上方蓝字关注我们作者:Cansluck优快云博客:https://blog.youkuaiyun.com/xgx120413开篇介绍大家好,公众号【Java极客思维】近期会整理一些Java高频面试题分享给小伙伴,也希望看到的小伙伴在找工作过程中能够用得到!本章节主要针对Java快速排序算法的实现进行分享。首先,来看一下,快速排序的实现的动态图:快速排序介绍:快速排序,根据教科书说法来看,是冒泡...

weixin_39588223的博客 559

快速排序[算法]

快速排序是我们经常用到的一种排序算法,它相比与 冒泡排序,时间的复杂度更小,速度更快 ,此排序采用了二分的思想,具体操作步骤如下: 1:从左边随便找一个基数(为了方便,就找最左边的那个) 2:然后最左边的那个下标记作i ,最右边的记作j ,然后,从右边找到一个比 之前那个基数小的数, 记录那个数的下标,然后,从左边找到一个比之前 那个基数大的数,同样的,记录它的下标。 3:交换这两个数; 4:重复2,和3 操作,直到i==j ,然后让第一个数 和 第i个数 交换; 不断重复上述过程,直至最后 完成了两个数之

牛大春の博客 408

算法训练之快速排序

主要是练习算法基础当中的快速排序

qq_62904883的博客 960

算法之旅——快速排序算法

快速排序(Quicksort)是一种平均时间复杂度为O(n*log n)的高效排序法。其基本思想是:先设置一个比较值value,通常value为数组的第一个数(当然也可以设为其他的数,不过设第一个数方便些),通过一趟排序将要排序的数据分割成独立的左右两部分,其中左端的所有数据都小于等于value值,右端的数据都大于value值,然后再按此方法对这两端的数据分别进行快速排序,整个排序过程递归进行

hust_luojun的博客 1087
上一篇: 【算法】归并排序(小和问题,逆序对问题)
下一篇: 【Java】Optional的使用
尹正义
博客等级 码龄6年 134粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值