算法图解之快速排序

Posted lshedward

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法图解之快速排序相关的知识,希望对你有一定的参考价值。

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

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 )。

以上是关于算法图解之快速排序的主要内容,如果未能解决你的问题,请参考以下文章

图解算法之快速排序算法第一

《算法图解》之快速排序

算法图解之快速排序

排序算法总结(转)

排序算法之快速排序(Java)

排序算法之快速排序(Java)