博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法图解之快速排序
阅读量:6637 次
发布时间:2019-06-25

本文共 1491 字,大约阅读时间需要 4 分钟。

快速排序比选择排序要快得多,采用分而治之的思想,具体实现是用递归。

1. 基线条件

数组为空或只包含一个元素

2. 递归条件

将数组分解,直到满足基线条件

3. 工作原理

  1. 先从数组中选择一个元素,这个元素我们称之为基准值(pivot)
  2. 找出比基准值小的值放在基准值左边以及比基准值大的值放在基准值右边。
  3. 递归左边和右边的元组,直到都满足基线条件后,从栈最高层开始返回。

4. 代码实现

1 def quicksort(array):  2     if len(array) < 2:  3         return array  4     pivot = array[0]  5  6     lesser = [item for item in array[1:] if item <= pivot]  7     greater = [item for item in array[1:] if item > pivot]  8  9     return quicksort(lesser) + [pivot] + quicksort(greater) 10 11 print(quicksort([5,10,23,222,3,0,12,412,4]))

 

5. 合并排序和选择排序

这里要说一下合并排序,运行时间为O(n log n)。而快速排序在最糟糕的情况下的运行时间是O(n 2 ),与选择排序一样。

但是我们还是要用快速排序,因为快速排序的平均时间是O(n log n)。而合并序有一个常量,等于每次计算都会加上一个常量,所以实际上快速排序速度更快,前提这两种算法的大O运行时间差不多。如果是两种算法的大O运行时间不同,这样常量将无关紧要。比如二分查找和简单查找。

 

6.快速排序的平均情况和最糟情况

只有每次将第一个元素作为基准值,才会出现最糟糕的情况O(n 2 )。最好的情况O(log n)是每次基准值都是中间值。

当层数为O(log n)(用技术术语说,调用栈的高度为O(log n)),而每层需要的时间为O(n)。因此整个算法需要的时间为O(n) * O(log n) = O(n log n)。这就是最佳情况。

在最糟情况下,有O(n)层,因此该算法的运行时间为O(n) * O(n) = O(n 2 )。

 

7. 复杂版本

def partition(array, left, right):    pivot = array[left]    while left < right:        #  当右边没有比pivot小的数,right就一直走到和left重合了,下面这个条件是无法退出循环的,right会一直-1        # while array[right] >= pivot:        while left < right and array[right] >= pivot:  # 从右边找比pivot小的数            right -= 1  # 往左走一步        # 如果left已经和right重合了。那么array[left]=array[right]就是自己等于自己        array[left] = array[right]  # 找到了比pivot小的数,把当前小的那个数放到最左边        print(array)        # 下面的while的left

 

 

转载于:https://www.cnblogs.com/lshedward/p/10447608.html

你可能感兴趣的文章
UIT创新科:大力护盘自主可控高效存储
查看>>
为什么数据中心需要使用VMware NSX?
查看>>
hashCode()方法的性能优化
查看>>
演讲实录丨汤劲松 Quanergy固态激光雷达与智能驾驶感知技术的开发
查看>>
Java核心技术卷I基础知识3.10.6 多维数组
查看>>
Spark高级数据分析· 3推荐引擎
查看>>
Docker集群轻松部署Apache Storm
查看>>
ReportEngineService
查看>>
促销保障并不难,架构设计轻松学
查看>>
Owin:“System.Reflection.TargetInvocationException”类型的未经处理的异常在 mscorlib.dll 中发生...
查看>>
promise
查看>>
修改IDEA的配置目录
查看>>
【融云分析】 IM 即时通讯之链路保活
查看>>
微信小程序开发之在小程序里面打开web页面
查看>>
451 Sort Characters By Frequency
查看>>
PDF生成插件 TcPDF
查看>>
JavaScript中的原型与原型链
查看>>
Kafka 监控架构设计
查看>>
阿里云POLARDB荣膺2019中国数据库年度最佳创新产品
查看>>
关于UIImagePickerController使用3DTouch的Crash问题
查看>>