算法图解之快排归纳整理

快速排序

分而治之D&C 是一种解决问题的思路和方法,也是我们第一种了解的算法思想的方法

4.1 分而治之(思想)

将最小的基线条件找出,不断的缩小范围
sum函数 将list里的元素单独取出进行相加求和

4.2 快速排序

当你做算法排序的时候,第一步是什么?

第一步:先找到基线条件,什么是基线条件?

基线条件就是基础的退出循环的条件

1. 当数组为空的时候,可以退出循环。
2. 当数组只有一个值的时候,不需要排序,可以退出循环。

所以在快速排序过程中第一句的代码如下:

def quicksort(array):
    if len(array)<2:
        return array

第二步:接下来我们来查看一下更长的数组的处理

以两个元素为例,当一个数组里有两个元素需要排序时,也很简单,我们将其中一个元素和另一个元素做对比,如果第一个元素比第二个元素大,我们就交换他的位置,如果不是,那我们就不变。

如果是三个元素呢?我们明白要使用D&C,我们需要将数组分解,直到满足基线条件。

快排原理:
  1. 从数组(假设数组为[15,10,33])中选择一个元素,这个元素被称为基准值,(可以是第一个,也可以是任意一个)
  2. 我们选出一个基准值33,找出比基准值小的元素以及比基准值大的元素,图下的例子,我们称为分区!
    在这里插入图片描述
现在有三个部分:,
  • 一个由所有小于基准值的数组组成的子数组
  • 一个基准值
  • 一个由所有大于基准值的数组组成的子数组

这里我们只是进行了分区,两个子数组是无序的,如果两个子数组是有序的如下图所示
在这里插入图片描述
我们直接得到一个 左边数组 + 基准值 + 右边数组 如图就是 [10 ,15] + [33] + [ ]
那我们直接可以得到有序数组[ 10 ,15 ,33]
接下来我们试试对这个子数组进行排序
我们想要的结果就是使用了快速排序之后

quicksort([15,10]) + [33] + quicksort([])
> [10,15,33]

现在我们知道当有三个元素的时候,我们如何进行排序了,无论我们选哪个数作为基准值,上述条件满足我们的排序都适用。如果是四个元素呢?
在这里插入图片描述
左边刚好是我们上面提到的三个元素你会
排序:对其用递归调用快速排序
如果你可以对四个进行排序,那五个也可以
在这里插入图片描述
五个元素的时候我们可以列举出你选择不同的基准值对你做排序算法的情况
在这里插入图片描述
这些元素都是包含0~4个元素,所以不管你选什么基准值,都可以正常的对其进行排序。同理我们也可以对6个甚至更多的元素进行排序,以此类推
上面的步骤,我们就称为归纳证明:

如:一个人爬梯子,想要爬到最高处,他需要一只脚移动到第二层,另一只移动到第三层,再讲第一只移动到第四层,就可以爬到楼顶。

代码实例:

import random


# 快速排序的算法分解

def quick_sort(array: list):
    if len(array) < 2:
        # 基线条件,当数组只剩下1或者0个元素时,我们将数组return
        return array
    pivot = array[0]  # 获取一个基准值
    left_list = []
    right_list = []
    for i in range(1, len(array)):
        if array[i] > pivot:
            right_list.append(array[i])
        else:
            left_list.append(array[i])
    return quick_sort(left_list) + [pivot] + quick_sort(right_list)


def create_random_list(length: int, l: int, r: int):
    i = 0
    list1 = []
    while i < length:
        list1.append(random.randint(l, r))
        i += 1
    return list1


if __name__ == '__main__':
    random_list = create_random_list(100, 10, 200)
    print(random_list)
    print(quick_sort(random_list))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端工匠之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值