目录
前言:
快速排序
1.概念
2.示例
Python代码实现
递归实现快速排序
前言:
今天我们就来一起学习快速排序的思想方法,然后通过Python语言来实现快速排序的功能,下面我们就开始今天的学习吧!
快速排序
1.概念
快速排序其实是冒泡排序的一种改进形式,其排序速度快,时间复杂度小的特点,成为了很多编程语言封装的排序方法
实现逻辑
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
① 从数列中挑出一个元素,称为 “基准”(pivot),
② 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
③ 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
图解如下:
2.示例
这里有一组数字,3,5,7,1,3,6 如下所示,要对这组数字进行排序
第一步,先选取基准数temp,一般是以第一个数字作为基准数,然后标记i和j的位置,分别为头跟尾。
第二步,在 i< j 的前提下开始移动j 和 i,原则是先移动j ,再移动i,当 j 遇到比i指向的数字要小的数字就停止移动,然后开始移动 i,当 i 遇到比temp要大的数字就停止移动,此时开始对i和j 指向的数字进行交换,以此类推。
第三步,当i 和 j 移动到相遇的位置的时候,把i和j相遇指向的数字与temp进行交换,这时候会发现,交换后的数字右边都是比这个数字要大的,左边都是比这个数字要小的。
第四部,进入递归,这时候我们要把上一步i和j交换后指向的数字左边和右边分别进行递归,也就是这两边再次走完前面的全部流程,最后结果就是已经排序好了的数字了。
Python代码实现
递归实现快速排序
#快速排序
import random as r
def quick(left,right,li):
if left>right:
return
temp=li[left]#获取到数组第一个数字
i=left #标记i 的位置
j=right #标记 j的位置
while i!=j:
while li[j]>=temp and i<j:
j-=1
while li[i]<=temp and i<j:
i+=1
if i<j:
li[i],li[j]=li[j],li[i] #数字交换
li[left],li[i]=li[i],li[left] #当i和j相遇的时候,进行与temp数字交换
quick(left,i-1,li) #左边进入递归
quick(i+1,right,li) #右边进入递归
return
if __name__ == '__main__':
li=[r.randint(0,20) for _ in range(10)]
print(li)
quick(0,len(li)-1,li)
print(li)
#输出结果:
#[2, 11, 20, 5, 13, 16, 11, 14, 20, 8]
#[2, 5, 8, 11, 11, 13, 14, 16, 20, 20]
好了,以上就是今天的全部内容了,我们下一期再见!
分享一张壁纸: