排序算法——快速排序详细解释

快速排序(Quicksort)是一种常用的排序算法,其基本思想是通过分治的策略将一个数组分成两个子数组,然后分别对这两个子数组进行递归排序

一、快速排序算法的大致思路如下:

1、我们在对列表进行排序的过程中,当数组中只有一个列表元素,进行排序最快。即不用排序。

所以我们在对列表进行快速排序的时候,需要检查需要排序的列表是否只包含一个列表元素。若只包含一个列表元素,则直接返回原来的列表即可。

2、当列表中存在多个列表元素的时候,则需要我们对列表内容进行排序。这个排序过程即快速排序算法的核心:函数名([小于参考值的列表元素])+[参考值]+函数名([大于参考值的列表元素])

二、解释快速排序算法的核心:

我们需要先随便找一个列表元素作为参考值,然后通过for循环和if语句的结合找到小于参考值的列表元素,并将这些列表元素放置到一个新的列表中保存,命名为less。同理找到大于参考值的列表元素,用一个空的列表进行存储,命名为greater。最后结合递归算法,返回结果为(从小到大排序):将less的内容作为参数再次传入到快速排序算法函数中+参考值+将greater的内容作为参数再次传入到快速排序算法函数中。这样通过层层递归那么最后得到返回的结果就为一个有序的列表内容。

三、代码演示:

从小到大排序效果具体实现代码如下:

复制代码
def quicksort(array): 
    if len(array) < 2: #判断列表中是否只有一个列表元素 
        return array 
    else:
        pivot = array[0]                 
        less = [i for i in array[1:] if i <= pivot] #获取小于参考值的列表元素,并将其保存在列表中   
        greater = [i for i in array[1:] if i > pivot] #获取大于参考值的列表元素,并将其保存在列表中 
        return quicksort(less) + [pivot] + quicksort(greater) #通过递归实现排序功能
print(quicksort([10,5, 2, 5,5,6.54,3]))

从小到大排序效果具体实现代码如下:(只需要将凭借顺序修改即可:函数名([大于参考值的列表元素])+[参考值]+函数名([小于参考值的列表元素]))

复制代码
def quicksort(array): 
    if len(array) < 2: #判断列表中是否只有一个列表元素 
        return array 
    else:
        pivot = array[0]                 
        less = [i for i in array[1:] if i <= pivot] #获取小于参考值的列表元素,并将其保存在列表中   
        greater = [i for i in array[1:] if i > pivot] #获取大于参考值的列表元素,并将其保存在列表中 
        return quicksort(greater) + [pivot] + quicksort(less) #通过递归实现排序功能
print(quicksort([10,5, 2, 5,5,6.54,3]))

四、快速排序算法执行过程(从小到大):

输入数据:10 ,5, 2, 6

代码正常运行,输入列表内容不满足判断语句,继续执行**:参考值:10** 第一次返回结果:[5,2,6] ,10,[]

quicksort(less)第一次递归:判断语句检测到[5,2,6] 不满足条件,继续执行: 参考值:5 第二次返回结果:[2] 5 [6]

quicksort(less)第二次递归:判断语句检测到[2]满足条件,返回2

quicksort(greater)第二次递归,判断语句检测到[6]满足条件,返回6

参考值的左边结束递归后返回结果为:[2,5,6]

参考值:10

quicksort(greater)第一次递归:判断语句检测[]满足条件,返回结果:[]

参考值的左边结束递归后返回结果为:[]

最后全部递归执行完毕后:将参考值左边列表内容+参考值+参考值右边列表内容,返回得到最后的排序结果:[2,5,6,10]

相关推荐
想跑步的小弱鸡1 分钟前
Leetcode hot 100(day 4)
算法·leetcode·职场和发展
Fantasydg2 分钟前
DAY 35 leetcode 202--哈希表.快乐数
算法·leetcode·散列表
jyyyx的算法博客3 分钟前
Leetcode 2337 -- 双指针 | 脑筋急转弯
算法·leetcode
呵呵哒( ̄▽ ̄)"9 分钟前
线性代数:同解(1)
python·线性代数·机器学习
SweetCode14 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
CryptoPP27 分钟前
springboot 对接马来西亚数据源API等多个国家的数据源
spring boot·后端·python·金融·区块链
ゞ 正在缓冲99%…27 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong28 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
xcLeigh35 分钟前
OpenCV从零开始:30天掌握图像处理基础
图像处理·人工智能·python·opencv
大乔乔布斯35 分钟前
AttributeError: module ‘smtplib‘ has no attribute ‘SMTP_SSL‘ 解决方法
python·bash·ssl