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

快速排序算法Python实现

快速排序原理和步骤

快速排序是一种高效的排序算法,基于分治法(Divide and Conquer)来实现。其基本思想是通过一次排序将数组分成两部分,其中一部分的所有元素都小于另一部分,然后递归地对这两部分进行排序。以下是快速排序的详细步骤:

1. 选择基准元素

首先,从数组中选择一个基准元素(pivot)。基准元素的选择方法有多种,例如选择第一个元素、最后一个元素、中间元素或随机选择一个元素。基准元素用于将数组分成两部分。

2. 分区

通过遍历数组,将所有小于基准元素的元素放到基准元素的左边,所有大于基准元素的元素放到基准元素的右边。这个过程称为分区(partitioning)。分区后,基准元素的位置是其在最终排序数组中的正确位置。

3. 递归排序

对基准元素左边的子数组和右边的子数组分别递归地应用快速排序。这个过程将不断分割和排序子数组,直到所有子数组的长度为1,表示数组已经有序。

4. 合并

由于快速排序是原地排序(in-place sorting),不需要额外的合并步骤。递归过程结束后,整个数组已经有序。

快速排序的完整步骤

  1. 选择基准: 选择一个基准元素。
  2. 分区: 将数组分成两部分,一部分小于基准元素,另一部分大于基准元素。
  3. 递归排序: 递归地对基准元素左边和右边的子数组进行排序。
  4. 完成: 递归结束后,数组有序。

快速排序的伪代码

void quickSort(vector<int>& arr, int low, int high) {if (low < high) {// 获取分区点int pi = partition(arr, low, high);// 对分区点左边的子数组进行递归排序quickSort(arr, low, pi - 1);// 对分区点右边的子数组进行递归排序quickSort(arr, pi + 1, high);}
}int partition(vector<int>& arr, int low, int high) {// 选择最后一个元素作为基准int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high - 1; j++) {// 如果当前元素小于或等于基准if (arr[j] <= pivot) {i++;// 交换 arr[i] 和 arr[j]swap(arr[i], arr[j]);}}// 交换 arr[i + 1] 和 arr[high] (或基准)swap(arr[i + 1], arr[high]);return (i + 1);
}

Python实现:

def quick_sort(arr):"""对数组进行快速排序:param arr: 待排序的数组:return: 已排序的数组"""# 如果数组的长度为0或1,直接返回数组if len(arr) <= 1:return arr# 选择数组的最后一个元素作为基准pivot = arr[-1]# 定义两个空列表,分别存放小于和大于基准的元素left = []right = []# 遍历数组(不包括最后一个元素,即基准)for element in arr[:-1]:if element < pivot:left.append(element)else:right.append(element)# 递归地对左右两个子数组进行快速排序,并合并return quick_sort(left) + [pivot] + quick_sort(right)

相关文章:

  • 【人工智能】-- 迁移学习
  • 包管理器-npm、yarn、cnpm、pnpm的比较
  • JDK安装详细教程(以JDK17为例)
  • c++将utf8转gb2312
  • Tomcat组件概念和请求流程
  • 【Redis】初识 Redis
  • [JS]认识feach
  • 设计模式的七大原则
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • 【Linux】进程间通信——命名管道和共享内存
  • 2024年公共文化与社会服务国际会议(ICPCSS 2024)
  • 事务的学习
  • C#小结:未能找到类型或命名空间名“xxx”(是否缺少 using 指令或程序集引用?)
  • 容器docker 架构命令案例
  • 文心快码——百度研发编码助手
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 2017前端实习生面试总结
  • Asm.js的简单介绍
  • JavaScript HTML DOM
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 基于webpack 的 vue 多页架构
  • 记录一下第一次使用npm
  • 前端js -- this指向总结。
  • 前端存储 - localStorage
  • 如何使用 JavaScript 解析 URL
  • linux 淘宝开源监控工具tsar
  • Python 之网络式编程
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #php的pecl工具#
  • $.ajax()参数及用法
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (4)STL算法之比较
  • (C11) 泛型表达式
  • (二)WCF的Binding模型
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (利用IDEA+Maven)定制属于自己的jar包
  • (十七)Flink 容错机制
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • ******之网络***——物理***
  • **PHP二维数组遍历时同时赋值
  • *上位机的定义
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .netcore如何运行环境安装到Linux服务器
  • .net对接阿里云CSB服务
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET业务框架的构建
  • /bin/bash^M: bad interpreter: No such file or directory
  • ;号自动换行
  • @EnableWebMvc介绍和使用详细demo
  • @Not - Empty-Null-Blank
  • [ 手记 ] 关于tomcat开机启动设置问题