首页 > 其他分享 >快速排序

快速排序

时间:2023-09-11 19:24:04浏览次数:38  
标签:arr slow partition fast pivot 排序 快速 指针

快速排序

快速排序的基本思路是,通过partition操作,将数字划分为小于等于部分和大于部分,对于这个两个部分,再次分别进行partition,直到不能再分

在快速排序中,最核心的部分就是partition,在这里记录一下我理解partition的过程,partition有多种方法,我使用的是快慢指针的方法。

def partition(arr, l, r):
    # 以最后一个元素为基准,将[l,r]划分为两部分
    pivot = arr[r]
    # 慢指针 指向>=区域的第一个元素
    slow = l
    # 快指针 指向>=区域的最后一个元素
    for fast in range(l, r + 1):
        # 当快指针指向的元素小于pivot时,将其移动到大于区域的前面
        if arr[fast] < pivot:
            arr[slow], arr[fast] = arr[fast], arr[slow]
            slow += 1

    # 将pivot换到slow位置
    arr[slow], arr[r] = arr[r], arr[slow]
    return slow

在上面的代码中,我们定义了两个指针,slow和fast,可以看到,fast指针每次都加1,slow指针有时候加1。随着for循环的执行,fast指针会比slow指针更快的向前移动,代码通过控制fast和slow的移动以及交换元素,使得[slow, fast]这个区间中的元素都是>=pivot。

在for循环之后,我们将pivot换到slow位置,也就是[slow, fast]这个区间的第一个位置。

这样,我们将[l, slow-1]区间都换成了比pivot更小的元素,将[slow+1, r]区间换成了比pivot更大的元素。

最后附上利用partition将排序的代码

def sort_(arr, l, r):
    if l >= r:
        return
    m = partition(arr, l, r)
    sort_(arr, l, m - 1)
    sort_(arr, m + 1, r)

标签:arr,slow,partition,fast,pivot,排序,快速,指针
From: https://www.cnblogs.com/mengzhuo/p/17694278.html

相关文章

  • delphi FireDAC 数据集快速遍历方式
    FireDAC数据集快速遍历方式代码遍历数据集procedureTForm1.Button1Click(Sender:TObject);varvTick:DWORD;I:Integer;vCount:Integer;begin//查询数据FDQuery1.Open('SELECT*FROMtceshi');//获取全部数据FDQuery1.FetchAll;//通过Next方法......
  • 拓扑排序
           ......
  • 二叉排序树
          ......
  • 米联客 2024 版 FPGA 课程快速入口课程-目录速览(网页版没有页码)
    目录米联客2024版FPGA课程快速入口课程    101AMDFPGAvitis-vivado软件快速入门课程    91概述    92新建VIVADO工程    93添加代码管理文件夹    124添加PLLIP核    125新建工程文件    186完善RTL代码    227添加管脚约束......
  • 快速积累高质量的人脉:互相推荐合适的朋友
    以前,只看到和听到,很多销售或者老板经常向朋友介绍朋友,或者被人引荐。今年,在这方面,我也有不断尝试。最近,重新看的《从零开始做人脉》这本书,也有专门提到这种方法。这次,特意和大家分享一下我的实践体会。1.偶然在博客看到了“叶修涛”写的几篇文章。    看到这个同学的创业故事......
  • 深入了解选择排序算法
    在计算机科学中,排序是一个基本而重要的问题。排序算法有许多种,其中之一是选择排序(SelectionSort)。本文将深入介绍选择排序的工作原理,讨论其时间复杂度,以及提供Python、Go、Java和C语言的示例代码。选择排序的基本思想选择排序是一种比较排序算法,其基本思想是将数组分为已排序和未......
  • 探索GreatADM:如何快速定义监控
    引文在数据库运维过程中,所使用的运维管理平台是否存在这样的问题:1、默认监控粒度不够,业务需要更细颗粒度的监控数据。2、平台默认的监控命令不适合,需要调整阈值量身定制监控策略。3、不同类型的实例或组件需要有不同的监控重点,但管理平台监控固化,难以应对多样化的监控需求......
  • 教你快速了解C语言中的作用域和常量
    (章节目录)前言  哈喽,各位铁汁们好啊!✨今天来给大家带来的是初识C语言里面的作用域、常量。  这几章主要带大家简单认识-一下C语言,俗话说没吃过猪肉,也见过猪跑。带大家了解下C语言。可以读懂C语言的简单程序,后期会给大家详细介绍C语言。一、变量作用域和生命周期作用域......
  • MySQL基础篇:掌握MySQL数据排序,让你的数据分析事半功倍
    单一字段排序排序采用orderby子句,orderby后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,orderby默认采用升序,如果存在where子句那么orderby必须放到where语句的后面按照薪水由小到大排序(系统默认由小到大)mysql>select*fromEMPorderbySAL;+-------+--------+---......
  • 并查集 堆排序 (9/10)
    并查集模板 注意查找到后查找的节点直接连接根节点#include<iostream>usingnamespacestd;constintN=100010;intp[N];//关键记住find函数intfind(inta){if(p[a]!=a)p[a]=find(p[a]);//不等于根节点就往头结点走,并且等于returnp[a];}intma......