zoukankan      html  css  js  c++  java
  • 快速排序算法

    算法一:快速排序算法

    1.算法步骤:

    1 从数列中挑出一个元素,称为 "基准"(pivot)。

    2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

    3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。分解完成再一层一层返回,返回规则是:左边分区+基准值+右边分区

    递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

    举个例子,假设我现在有一个数列需要使用快排来排序:[11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22],我们来看看使用快排的详细步骤:

    2.代码实战:

    def quick_sort(b):
        """快速排序"""
        if len(b) < 2:
            return arr
        # 选取基准,随便选哪个都可以,选中间的便于理解
        mid = arr[len(b) // 2]
        # 定义基准值左右两个数列
        left, right = [], []
        # 从原始数组中移除基准值
        b.remove(mid)
        for item in b:
            # 大于基准值放右边
            if item >= mid:
                right.append(item)
            else:
                # 小于基准值放左边
                left.append(item)
        # 使用迭代进行比较
        return quick_sort(left) + [mid] + quick_sort(right)

    3.特点

    1. 稳定性:快排是一种不稳定排序,比如基准值的前后都存在与基准值相同的元素,那么相同值就会被放在一边,这样就打乱了之前的相对顺序

    2. 比较性:因为排序时元素之间需要比较,所以是比较排序

    3. 时间复杂度:快排的时间复杂度为O(nlogn)

    4. 空间复杂度:排序时需要另外申请空间,并且随着数列规模增大而增大,其复杂度为:O(nlogn)

    5. 归并排序与快排 :归并排序与快排两种排序思想都是分而治之,但是它们分解和合并的策略不一样:归并是从中间直接将数列分成两个,而快排是比较后将小的放左边大的放右边,所以在合并的时候归并排序还是需要将两个数列重新再次排序,而快排则是直接合并不再需要排序,所以快排比归并排序更高效一些,可以从示意图中比较二者之间的区别。

    6. 快速排序有一个缺点就是对于小规模的数据集性能不是很好

  • 相关阅读:
    [stm32] Systick
    [stm32] GPIO及最小框架
    51单片机-PC数据传输 温度 距离 监控系统设计
    [游戏学习29] Win32 图像处理1
    [51单片机] 串口通讯 简单通信
    [汇编] 闰年计算
    Java常用工具类之ArrayUtil
    常用工具类系列之DateUtil
    SpringBoot 获取当前登录用户IP
    Spring data jpa Specification查询关于日期的范围搜索
  • 原文地址:https://www.cnblogs.com/shierlou-123/p/11289743.html
Copyright © 2011-2022 走看看