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

快速排序

时间:2025-01-12 10:22:40浏览次数:1  
标签:基准值 复杂度 元素 数组 排序 快速 指针

快速排序(Quick Sort)是一种高效的排序算法,采用了分治(Divide and Conquer)的策略。以下为你详细介绍:

1. 基本原理

  • 从待排序的数据集中选择一个元素作为基准值(pivot)。基准值的选择方法多样,常见的有选择第一个元素、最后一个元素或者中间元素等。
  • 重新排列数据集,将所有小于基准值的元素放在基准值的左边,所有大于基准值的元素放在基准值的右边。这个过程称为分区(partition)操作。经过分区后,基准值就处于它在最终排序数组中的正确位置。
  • 对基准值左边和右边的两个子数据集,分别递归地应用上述步骤,直到每个子数据集只有一个元素(或没有元素),此时整个数据集就已完全排序。

2. 算法步骤

  1. 选择基准值:从数组中选择一个元素作为基准值。例如,可以选择数组的第一个元素、最后一个元素或者中间元素。
  2. 分区操作
    • 初始化两个指针,一个指向数组起始位置(left),另一个指向数组末尾位置(right)。
    • 从右向左移动 right 指针,找到第一个小于基准值的元素;从左向右移动 left 指针,找到第一个大于基准值的元素。
    • 如果 left 指针小于 right 指针,交换这两个元素,然后继续移动指针寻找下一对需要交换的元素。
    • left 指针和 right 指针相遇时,将基准值与 left 指针(或 right 指针,此时两者位置相同)指向的元素交换。此时,基准值处于正确的排序位置,并且数组被分成了左右两个子数组,左边子数组的所有元素小于基准值,右边子数组的所有元素大于基准值。
  3. 递归排序子数组:对左右两个子数组分别重复上述选择基准值和分区的过程,直到子数组的长度为 1 或 0,此时整个数组完成排序。

3. 代码实现

以下是Python语言实现快速排序的代码:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[0]
    left = []
    right = []
    for num in arr[1:]:
        if num <= pivot:
            left.append(num)
        else:
            right.append(num)
    return quick_sort(left) + [pivot] + quick_sort(right)

4. 算法分析

  • 时间复杂度
    • 平均情况:快速排序的平均时间复杂度为 \(O(nlogn)\),其中 n 是待排序数组的元素个数。这是因为每次分区操作大致将数组分成两个长度接近的子数组,递归深度为 \(logn\),每层递归的操作次数为 n
    • 最坏情况:当每次选择的基准值都是数组中的最大或最小元素时,分区操作会使数组极度不平衡,一个子数组为空,另一个子数组长度为 n - 1。这种情况下,快速排序的时间复杂度退化为 \(O(n^2)\)。
  • 空间复杂度
    • 平均情况:空间复杂度主要取决于递归调用的深度,平均递归深度为 \(logn\),所以平均空间复杂度为 \(O(logn)\)。
    • 最坏情况:在最坏情况下,递归深度达到 n,空间复杂度为 \(O(n)\)。
  • 稳定性:快速排序是不稳定的排序算法。例如,在数组 [2, 2*, 1] 中,如果选择第一个 2 作为基准值,在分区过程中,第二个 2 可能会被移动到第一个 2 的前面,导致相等元素的相对顺序发生改变。

标签:基准值,复杂度,元素,数组,排序,快速,指针
From: https://www.cnblogs.com/codersgl-blog/p/18666731

相关文章

  • 选择排序
    选择排序(SelectionSort)是一种简单直观的排序算法。它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。以下是选择排序的详细介绍:1.算法步骤初始状态:假设有一个长度为n的数组arr,待排序的元素集合为整......
  • 插入排序
    插入排序(InsertionSort)是一种简单直观的排序算法,它的工作原理类似于扑克牌的整理过程。在摸牌时,玩家会将每张新摸到的牌插入到手中已有的有序牌中的合适位置。1.算法步骤初始状态:将数组分为已排序和未排序两部分。初始时,数组的第一个元素被认为是已排序部分,其余元素是未排序......
  • VLLM - 快速且便宜的 LLM 服务
    这是一个高效易用的大型语言模型推理引擎,专为解决推理速度慢、资源利用率低等问题而设计。它基于PyTorch和CUDA,并结合内存优化算法(PagedAttention)、计算图优化和模型并行技术,大幅降低GPU内存占用,并充分利用多GPU资源提升推理性能。同时,vLLM与HF模型无缝兼容。支持在......
  • 拓补排序板子(邻接表实现)
    #include<iostream>#include<vector>usingnamespacestd;constintmaxn=2e5+5;vector<int>graph[maxn];//邻接表voidaddedge(intu,intv){graph[u].emplace_back(v);}intindegree[maxn];//入度表intmain(){intn,m;cin>>n>......
  • 课程表(拓补排序)
    题目链接:https://leetcode.cn/problems/course-schedule-ii/description/题意:给定n门课程,规定只有学完某一个课程才能继续学下一门课程,让你输出学习顺序。如果成环,则返回空数组思路:拓补排序,入度删除法需要提前准备一个indegree数组用来统计每个节点的入度大小,用数组模拟双端......
  • 20250108@Excel(排序问题+文本格式转换+查找多条件的个数)
    1.需求:首行标题需要显示 百分比问题:直接="时间进度:"&E1/E2,显示常规解决方法:使用text函数转换格式2.需求:当需要对某些数值排序时,如果出现相同数值,需要做并列排名问题:使用rank排序会出现中断层排名,如图,2之后是4解决方法:数与数之间进行比较,计算布尔值false的个数。3......
  • 全栈开发之小程序 网快速笔记,复习springboot 假期复习一套课程
    第六章登陆与注册 本章主要内容如下登陆注册相关<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper......
  • php二维数组根据某个字段排序
    1$worderData=[2[3'id'=>1,4'name'=>'张三',5'distance'=>0.1,6......
  • 2.6.桶排序
    桶排序桶排序也是一种非常快的排序算法,但是对于个别数组中某个元素比较大的情况比较费内存。它的实现分为三个步骤:第一步,根据数组创建桶。具体桶的个数取决于数组中元素的大小,所谓桶其实也是一个数组,只不过桶的索引代表数组的元素,而索引值代表在原数组中此元素的个数,例如......
  • 工厂MES系统是什么,一文带您快速掌握MES系统(附系统选型和客户案例)
    如果您想了解MES系统、如何选型系统、MES系统客户案例等,看这一篇就够了。尽管中国制造业在全球占据重要地位,但大部分制造企业仍面临诸多挑战:生产成本高、产品质量不稳定、生产交付效率低、设备使用寿命短、各部门数据孤岛等,成为限制企业发展的关键因素和市场竞争力。同时日益......