Python数据结构-----递归实现快速排序

目录

前言:

快速排序

1.概念

 2.示例

Python代码实现

递归实现快速排序


前言:

         今天我们就来一起学习快速排序的思想方法,然后通过Python语言来实现快速排序的功能,下面我们就开始今天的学习吧!

快速排序

1.概念

        快速排序其实是冒泡排序的一种改进形式,其排序速度快,时间复杂度小的特点,成为了很多编程语言封装的排序方法

实现逻辑

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

① 从数列中挑出一个元素,称为 “基准”(pivot),
② 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
③ 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

 图解如下:

快速排序的4种优化_Tyler_Zx的博客-CSDN博客_快排算法优化

 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]

 好了,以上就是今天的全部内容了,我们下一期再见!

分享一张壁纸:

猜你喜欢

转载自blog.csdn.net/m0_73633088/article/details/130268352