当前位置: 首页 > news >正文

排序算法-快速排序

1、快排思想

快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。

2、快排流程

1、选定一个基准元素

2、通过基准将数组分成左右两部分:将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。

2、重复步骤1、2,采用递归的方法:分别将左侧部分、右侧部分,按照步骤1、2排序,直至将无序序列排列成有序序列。

3、快排实现

def quick_sort(arr, left, right):
    if left >= right:
        return
    i, j = left, right    # 首尾指针
    while i < j:            
        while i < j and arr[j] >= arr[left]: # 以最左边第一个数为基准,先用尾指针往前扫描
            j -= 1
        while i < j and arr[i] <= arr[left]:
            i += 1
        if i < j:            # 交换2个数的位置
            arr[i], arr[j] = arr[j], arr[i]
    arr[left], arr[i] = arr[i], arr[left]   # 基准归位
    quick_sort(arr, left, i-1)   # 递归左半部分
    quick_sort(arr, i+1, right)  # 递归右半部分
    return arr

if __name__ == '__main__':
    # a = [10, 1, 5, 2, 4, 3, 2, 1]
    a = [5, 8, 7, 6, 3, 2, 1]
    left, right = 0, len(a)-1
    quick_sort(a, left, right)
    print(a)

4、复杂度分析

(1)时间复杂度分析

平均时间复杂度O(nlog_2n);

待排序列越接近无序,排序效率越高,最好时间复杂度O(nlog_2n)

待排序列越接近有序,排序效率越低,最坏时间复杂度O(n^2)

(2)空间复杂度分析

空间复杂度为O(log_2n),快排是递归进行的,递归需要栈的辅助。

PS:快排是一种不稳定的排序算法。

相关文章:

  • 12306项目学习笔记(框架篇Base)
  • nginx部署前端vue项目步骤
  • 【微信小程序】Mobx--绑定多个 store 以及命名空间
  • HarmonyOS ArkUI工程框架解析
  • SQL 快速参考
  • 算法day17|如何求普通二叉树的众数
  • 滑模控制2021年12月8日
  • 【Python零基础】Python测试
  • ASP.NET Core 入门教学五 集成日志
  • OpenCV小练习:身份证号码识别
  • 【Android】使用 ADB 查看 Android 设备的 CPU 使用率
  • es的简易dsl语句
  • ESP32利用大模型做聊天机器人
  • 2024年最强网络安全学习路线,详细到直接上清华的教材!
  • 【软考】磁盘的类型
  • 构建Spring Boot应用的微服务服务依赖管理
  • Jenkins服务安装配置
  • NoSql数据库 - Redis Cluster集群详解及案例实现
  • linux 云主机 pip 安装配置 letsencrypt certbot 为多个域名生成免费 https 证书实录
  • 小实战项目-第二章2.1-IIC协议讲解? 什么是软件IIC 什么是硬件IIC 有什么区别如何编写代码--这章节主要讲解软件IIC,下一章节讲解硬件IIC协议
  • 通往国际舞台之路:清政府与万国公会的交往
  • 董军同德国国防部长举行会谈
  • 网约车座椅靠背张贴“差评者得癌症”,如祺出行:未收到投诉无法处理
  • 《歌手2025》公布首发阵容,第一期就要淘汰一人
  • 刘国中:持续加强护士队伍建设,更好保障人民身体健康
  • 【社论】人工智能将为教育带来什么