杂学第五篇:python实现十大经典的排序算法(最简便的实现+自身理解)之快速排序

公示:相关概念解释及动图来源于https://www.cnblogs.com/onepixel/articles/7674659.html

首先吐槽下上图,上图在我参考的那个教程里面,他标示的快速排序就是这张图,但是我看了很久,跟我下面说的处理流程不一样,但是核心思想是一样的,就是分大小区,再依次判断。

这里再附上一个正统的处理流程:来源于 →→→这里←←​​​​​​​←

å¿«éæåº

简单解释一下快速排序的原理:说是先任意选择一个数作为基数,但一般直接用第一个,简单干脆,遍历一遍数组,把大于或小于这个基数移到两边 ,再对这两边在进行一次大小分区,知道最后的分的区个数为1为止。

好,上算法,推荐一种超便捷的方法,超便捷对我来说只是代码量少点而已,哈哈。

# 为什么还要传start和end进来,主要是方面控制此次遍历的数组的起始和结尾,这样可以在子分区排序的时候可以递归调用。
def QuickSort(myList, start, end):
    # 判断当首尾下边相等时,表示已经分好关于基数的大小区了,可结束排序
    if start < end:
        # 将start赋值给i,将end赋值给j
        i, j = start, end
        # 确定基值,默认为第一个
        base = myList[i]
        while i < j:
            # 先从最后循环,查找比基数小的值
            while (i < j) and (myList[j] >= base):
                j = j - 1
            # 找到之后 把这个小的值放在基数的位置,因为基数已经赋值给base了,所以现在比它小的放在前面
            myList[i] = myList[j]
            # 从前面开始遍历,但是由于上一步m[i](上一步找到比基数小的那个值)已经该变成m[j]的值,所以此时会进行一次i+1,而后面那句m[j]=m[i]是为了从前面遍历时找到比基数大的那个,必须要。
            while (i < j) and (myList[i] <= base):
                i = i + 1
            # 将找到的比基数大的那个值放到j的位置
            myList[j] = myList[i]
        # 把此次排好序的基值赋值给在i处排完序的那个值,不用担心会造成数据错乱,这个是其实是上一个排序值的复制,现在只是排好了,该用原来的基数代替回来,所以,经历过一次遍历之后的数组成为以基数为分割线,基数前面的是比它小的,后面是比它大的。
        myList[i] = base

        # 递归调用,第一个是递归比基数小的那部分,第二个是递归比基数大的那部分,这里其实i和j是同一个数,就像这样 [*,*,...,i-1,(i,j),j+1,...,*,*]
        QuickSort(myList, start, i - 1)
        QuickSort(myList, j + 1, end)
    return myList


myList = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
print("Quick Sort: ")
QuickSort(myList, 0, len(myList) - 1)
print(myList)

看注释以便小白方便理解。

好了,这就是我对快速排序的理解。虽然还有另外的方式实现,你们研读一下就发现思路的核心是一样的。但是我懒,只想记住最简单的实现。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值