python算法 之 快速排序(Quick Sort)

这篇具有很好参考价值的文章主要介绍了python算法 之 快速排序(Quick Sort)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

时间复杂度 名称 示例算法
O(1) 常数时间复杂度 哈希表查找
O(logn) 对数时间复杂度 二分查找
O(n) 线性时间复杂度 遍历数组
O(nlogn) 线性对数时间复杂度 快速排序
O(n^2) 平方时间复杂度 冒泡排序、插入排序
O(n^3) 立方时间复杂度 矩阵乘法
O(2^n) 指数时间复杂度 穷举搜索
O(n!) 阶乘时间复杂度 旅行商问题
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!)
一、快速排序

快速排序(Quick Sort)是一种基于分治思想的排序算法,是目前使用最广泛的排序算法之一。其基本思想是选取一个基准元素,然后将数组分成小于等于基准的子数组和大于基准的子数组,再递归地对这两个子数组进行快速排序,最后将它们合并起来即可。

二、快速排序步骤

快速排序: 的核心操作是分割数组操作
划分操作采用两种方式:Lomuto 分割和 Hoare 分割。

  • Lomuto 分割比较简单,但是在特定情况下会导致快速排序的时间复杂度退化为 O(n^2)
  • Hoare 分割较为复杂,但是效率更高,通常被认为是优化后的快速排序算法 nlong
    复杂度
    最坏复杂度 n^2
    平均复杂度 nlong
    递归复杂度 nlong

快速排序的基本步骤:文章来源地址https://www.toymoban.com/news/detail-762341.html

  1. 选取数组中的一个元素作为基准元素(通常是数组的第一个元素)。
  2. 将数组中比基准元素小的元素移动到数组的左边,将比基准元素大的元素移动到数组的右边。
  3. 对左右两边的数组分别重复上述操作,直到所有数组都有序为止。
选择数组第一位元素位基准值,创建两个新数组,分别存放小于基准值和大于基准值的元素
然后这两个新数组递归进行上述操作(再选新数组,再分组),直到数组为空
然后将左右数组和基准值进行拼接
三、应用例子
def quicksort(arr):
    # 如果数组长度小于等于1,则直接返回该数组
    if len(arr) <= 1:
        return arr
    else:
        # 选择第一个元素作为基准
        pivot = arr[0]
        # 构造小于等于基准的元素构成的子数组 less  构造大于基准的元素构成的子数组 greater
        less = [x for x in arr[1:] if x <= pivot]      # 输出比第一个元素小的列表
        greater = [x for x in arr[1:] if x > pivot]    # 输出比第一个元素大的列表
        print('less-----------', less)
        print('greater-----------', greater)
        # 递归地对这两个子数组进行快速排序,然后将它们合并起来,并加上基准元素
        return quicksort(less) + [pivot] + quicksort(greater)
        
if __name__ == '__main__':
    arr = [3, 5, 2, 8, 1, 4]
    sorted_arr = quicksort(arr)
    print(sorted_arr)
  1. 选择基准元素:从待排序数组中选择一个元素作为基准(通常选择第一个元素)
  2. 分割数组: 重新排列数组,将所有小于基准的元素放在基准的左边,所有大于基准的元素放在基准的右边,等于基准的元素可以放在任意一边。此时,基准元素的位置也已经确定
  3. 递归排序: 递归地对基准元素左边的子数组和右边的子数组进行快速排序
  4. 合并结果: 将左边子数组、基准元素、右边子数组依次拼接起来,得到排好序的数组

到了这里,关于python算法 之 快速排序(Quick Sort)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++STL】快速排序算法(sort)的原理与使用

    一、 sort 算法原理 std::sort 是 C++ 标准库中提供的排序算法,它使用的是一种经典的排序算法—— 快速排序 (Quicksort)或者是其变种。 快速排序是一种基于比较的排序算法,通过不断地选择一个基准值(pivot),将待排序序列分割为两个子序列,其中一个子序列的所有元素小

    2024年02月09日
    浏览(30)
  • 排序算法(stable_sort(), sort())

    sort函数我相信大家都不陌生,今天介绍一个新的排序算法stable_sort stable_sort:稳定排序算法,维持相等元素的原有顺序。 假如我们定义一个字符串数组 这些字符串是按照字典序排列的,我们现在想要words按照单词长度从小到大重排的同时,还希望具有相同长度的元素按照字典

    2024年02月07日
    浏览(36)
  • 【排序算法】堆排序(Heap Sort)

    堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 学习堆排序之前,有必要了解堆!若读者不熟悉堆,建议先了解堆(建议可以通过二叉堆,左倾堆,

    2024年02月01日
    浏览(57)
  • 46,排序算法sort

    排序算法sort 常用排序算法 sort 学习目标: 掌握i常用排序算法 算法简介: sort //对容器内元素进行排序 random_shuffle //洗牌,指定范围内的元素随机调整次序 merge //容器元素合并,并存储到另一容器中 reverse //反转指定范围的元素 功能描述: 对容器内元素进行排序 函数原型:

    2024年02月16日
    浏览(27)
  • 【算法】桶排序(Bucket Sort)详解

    桶排序(Bucket Sort)又称箱排序,是一种比较常用的排序算法。其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序(可以是递归使用桶排序,也可以是使用其他排序算法将每个桶分别排好序),最后一次将每个桶中排好序的数输出。 桶排序的思想就是把待排序

    2024年01月24日
    浏览(31)
  • C++(15): STL算法:排序(sort)

            std::sort 是 C++ 标准库 algorithm 中提供的一个函数,用于对容器(如数组、向量等)中的元素进行排序。它基于比较操作对元素进行排序,通常使用高效的排序算法,如快速排序、归并排序或堆排序等。         在实际应用中,std::sort 通常会根据输入数据的大

    2024年04月12日
    浏览(23)
  • 算法 - 归并排序(Merge_sort)

    目录 什么是归并排序(Merging_sort)? 归并排序的适用场景: 演示归并排序的过程(默认arr和brr两个数组都是有序的): 代码实现: 如果我们事先并没有分配好两个已经排序好的数组,而是直接的一个无序序列呢? 代码实现: 在写归并排序的代码之前,我们先对归并排序的定义

    2024年02月13日
    浏览(39)
  • python实现快速排序算法

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

    2024年02月06日
    浏览(32)
  • Python算法——快速排序

    快速排序(Quick Sort)是一种高效的分治排序算法,它选择一个基准元素,将数组分成两个子数组,小于基准的放在左边,大于基准的放在右边,然后递归地排序子数组。快速排序通常比冒泡排序和选择排序更高效,特别适用于大型数据集。本文将详细介绍快速排序的工作原理

    2024年02月05日
    浏览(28)
  • [排序算法]:归并排序(Merge Sort)(递归与非递归实现详解)

            归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

    2024年01月20日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包