数据结构与算法03(python实现)__快速排序

快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

步骤为:

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

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

复制代码
def quick_sort(li, start, end):
    # start:指明排序的列表的起始下标
    # end:指明排序的列表的结束下标
    '''
        快速排序
        找一个基准,使得左边的都比它小,右边的都比它大
        再对上一步的左右边,分别找其的基准,使得它满足左边的比它小,右边的比它大
        递归上面的步骤
        最终达到,每个元素所处的位置,就是他正确排序后对应的index(下标)
    '''
    # 补充:递归的终止条件
    if start >= end:
        return

    # 假定的基准
    mid = li[start]
    # 开始让两边进行移动操作
    # 需要两个游标
    left = start
    right = end

    # 只有左游标小于右游标,重复下面的分别移动
    while left < right:
        # 先移动右侧
        while left < right and li[right] > mid:
            right -= 1  # 不断左移
        # 设置值,把这个值,设置给左边
        li[left] = li[right]

        # 移动左边
        while left < right and li[left] < mid:
            left += 1
        # 设置值
        li[right] = li[left]

    # 退出循环的时候,表示找到了中间位置
    li[left] = mid  # 找到了mid的正确位置

    # 递归
    quick_sort(li, start, left-1)  # 这里不能切片,传的都是同一个列表对象
    quick_sort(li, left+1, end)


if __name__ == '__main__':
    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li)
    quick_sort(li, 0, len(li)-1)
    print(li)
复制代码

 

posted @   胖白白  阅读(153)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示