0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python最简单实现快速排序的办法

马哥Linux运维 来源:裸睡的猪 作者:猪哥 2020-01-01 15:02 次阅读

一、算法介绍

排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各种排序算法。其中”快速排序”(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(托尼·霍尔)于1960时提出来的。

二、算法原理

快排的实现方式多种多样,猪哥给大家写一种容易理解的:分治+迭代,只需要三步:

在数列之中,选择一个元素作为”基准”(pivot),或者叫比较值。

数列中所有元素都和这个基准值进行比较,如果比基准值小就移到基准值的左边,如果比基准值大就移到基准值的右边

以基准值左右两边的子列作为新数列,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

举个例子,假设我现在有一个数列需要使用快排来排序:{3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48},我们来看看使用快排的详细步骤:

选取中间的26作为基准值(基准值可以随便选)

数列从第一个元素3开始和基准值26进行比较,小于基准值,那么将它放入左边的分区中,第二个元素44比基准值26大,把它放入右边的分区中,依次类推就得到下图中的第二列。

然后依次对左右两个分区进行再分区,得到下图中的第三列,依次往下,直到最后只有一个元素

分解完成再一层一层返回,返回规则是:左边分区+基准值+右边分区

三、代码实现

quick_sort = lambda array: array if len(array) 《= 1 else quick_sort([item for item in array[1:] if item 《= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item 》 array[0]])

是不是很简洁很秀,如果再有面试官让你手写一个快排,你就把这行写上去吧,面试官见了都要喊你秀儿,哈哈。

在你感叹python炫酷吊炸天的同时,你因该考虑到代码的可读性问题,lambda函数设计是为了代码的简洁性,但是滥用的话会导致可读性变得极差,而且现在pep8代码规范中也不建议使用lambda函数了,建议使用关键字def去定义一个函数,所以下面猪哥给大家写一段符合pythonic风格的快排代码

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

四、算法分析

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

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

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

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

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

五、快排优化

快速排序有一个缺点就是对于小规模的数据集性能不是很好。可能有人认为可以忽略这个缺点不计,因为大多数排序都只要考虑大规模的适应性就行了。但是快速排序算法使用了分治技术,最终来说大的数据集都要分为小的数据集来进行处理,所以快排分解到最后几层性能不是很好,所以我们就可以使用扬长避短的策略去优化快排:

先使用快排对数据集进行排序,此时的数据集已经达到了基本有序的状态

然后当分区的规模达到一定小时,便停止快速排序算法,而是改用插入排序,因为我们之前讲过插入排序在对基本有序的数据集排序有着接近线性的复杂度,性能比较好。

这一改进被证明比持续使用快速排序算法要有效的多,下期猪哥就会带大家实际测试这几种算法的性能。

六、模拟面试

面试官:你了解快排吗?

你:略知一二

面试官:那你讲讲快排的算法思想吧

你:快排基本思想是:从数据集中选取一个基准,然后让数据集的每个元素和基准值比较,小于基准值的元素放入左边分区大于基准值的元素放入右边分区,最后以左右两边分区为新的数据集进行递归分区,直到只剩一个元素。

面试官:快排有什么优点,有什么缺点?

你:分治思想的排序在处理大数据集量时效果比较好,小数据集性能差些。

面试官:那该如何优化?

你:对大规模数据集进行快排,当分区的规模达到一定小时改用插入排序,插入排序在小数据规模时排序性能较好。

面试官:那你能手写一个快排吗?

你:

quick_sort = lambda array: array if len(array) 《= 1 else quick_sort([item for item in array[1:] if item 《= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item 》 array[0]])

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 排序算法
    +关注

    关注

    0

    文章

    52

    浏览量

    10051
  • python
    +关注

    关注

    55

    文章

    4779

    浏览量

    84440

原文标题:Python一行代码实现快速排序

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Python实现的常见内部排序算法

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因
    发表于 07-06 12:35 338次阅读
    <b class='flag-5'>Python</b><b class='flag-5'>实现</b>的常见内部<b class='flag-5'>排序</b>算法

    matlab实现快速排序法(原创)

    使用快速排序法进行排序,本以为很简单就可以实现,但搜索了一下help文档,只有C中的qsort存在,况且调用比较麻烦,其实在数据结构中,
    发表于 08-15 11:33

    matlab快速排序算法实现

    只有C中的qsort存在,调用比较麻烦,其实在数据结构中,快速排序法是经典排序之一,上网搜了一下简介,把对应的VC程序改了一下,做成了下面的matlab代码:%快速
    发表于 02-29 15:58

    快速学习Python的技巧

    )有很多老的Python排序代码,它们在你创建一个自定义的排序时花费你的时间,但在运行时确实能加速执行排序过程。元素排序的最好方法是尽可能使
    发表于 07-27 14:58

    python排序得出序号各类的方法

    python排序、得出序号各类方法大全 numpy pandas
    发表于 06-13 10:21

    C#实现快速排序

    快速排序法是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字
    发表于 08-09 17:57 16次下载

    C语言实现简单的基数排序

    本文主要阐述的类容是C语言实现简单的基数排序。基数排序是一种分配排序,其基本思想是:排序过程无须
    发表于 02-05 14:57 1777次阅读
    C语言<b class='flag-5'>实现</b><b class='flag-5'>简单</b>的基数<b class='flag-5'>排序</b>

    快速排序是一种交换排序

    快速排序在每次分割的过程中,需要 1 个空间存储基准值。而快速排序的大概需要 Nlog2N次的分割处理,所以占用空间也是 Nlog2N 个。
    的头像 发表于 07-27 14:49 2872次阅读
    <b class='flag-5'>快速</b><b class='flag-5'>排序</b>是一种交换<b class='flag-5'>排序</b>

    各种排序算法的分析及java&python实现

    排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序
    的头像 发表于 02-28 16:14 1778次阅读
    各种<b class='flag-5'>排序</b>算法的分析及java&<b class='flag-5'>python</b><b class='flag-5'>实现</b>

    Python中的排序

    另外一种排序方法是 sorted ,此方法不是原地排序,以第一个值进行排序,同样也是默认升序排序
    的头像 发表于 09-07 16:25 2145次阅读
    <b class='flag-5'>Python</b>中的<b class='flag-5'>排序</b>

    python实现简单爬虫的资料说明

    本文档的主要内容详细介绍的是python实现简单爬虫的资料说明。
    发表于 11-02 17:53 21次下载
    <b class='flag-5'>python</b><b class='flag-5'>实现</b><b class='flag-5'>简单</b>爬虫的资料说明

    DN401-电源排序变得简单

    DN401-电源排序变得简单
    发表于 04-15 20:50 7次下载
    DN401-电源<b class='flag-5'>排序</b>变得<b class='flag-5'>简单</b>

    C语言排序快速排序的技巧

    快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,
    的头像 发表于 07-29 15:14 2442次阅读
    C语言<b class='flag-5'>排序</b>中<b class='flag-5'>快速</b><b class='flag-5'>排序</b>的技巧

    php版冒泡排序是如何实现的?

    无论学习哪一种编程语言,进行算法方面的训练时都绕不开“排序”。排序在进阶编程中有非常广泛的应用,要想成为编程高手,排序算法是必须要掌握的。而冒泡排序算法作为一种交换
    的头像 发表于 01-20 10:39 888次阅读
    php版冒泡<b class='flag-5'>排序</b>是如何<b class='flag-5'>实现</b>的?

    python升序和降序排序代码

    Python是一种简洁而强大的编程语言,提供了许多实用的函数和方法来排序数据。在本文中,我们将详细讨论Python中的升序和降序排序。我们将深入探讨不同的
    的头像 发表于 11-21 15:20 3110次阅读