`

排序算法学习(python版本)之快速排序(QuickSort)

阅读更多
快速排序是由東尼·霍爾所發展的一種排序算法。在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部循环(inner loop)可以在大部分的架構上很有效率地被實作出來。

最差时间复杂度:O(n^2)
最优时间复杂度:O(nlogn)
平均时间复杂度:O(nlogn)


快速排序使用分治法(Divide and conquer)策略來把一個序列(list)分為兩個子序列(sub-lists)。
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
步驟為:
  1. 從數列中挑出一個元素,稱為 "基準"(pivot),
  2. 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割結束之後,該基準就處於數列的中間位置。這個稱為分割(partition)操作。
  3. 递归地(recursive)把小於基准值元素的子數列和大於基准值元素的子數列排序。

遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會結束,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。

性能分析最好情况每次基准的最终位置都是在数组中间位置,从而使规模为N的问题分为2个规模为N/2的问题,即T(n) = 2T(n/2) + Θ(n),用递归树分析或者主定理得到时间T(n) = O(nlogn)。
最坏情况每次基准的最终位置都是第一个位置,从而规模为N的问题分为一个规模为N-1的问题,即T(n) = T(n-1) + Θ(n),用递归树分析可得运行时间T(n) = O(n2)。
平均情况假设规模为N的问题分为一个规模为9/10N的问题和规模为1/10N的问题,即T(n) = T(9n/10) + T(n/10) + Θ(n),用递归树分析可得T(n) = O(nlogn),而且比分区9:1要更平均(也就是情况更好)的概率为80%,所以在绝大部分情况下快速排序算法的运行时间为O(nlogn)。

代码:
#!/usr/bin/env python
#-*-encoding:utf-8-*-

def quick_sort(L):
    if not L:
        return []
    return quick_sort([x for x in L[1:] if x < L[0]]) + L[0:1] + \
           quick_sort([x for x in L[1:] if x > L[0]])

def main():
    L = [55,22,33,11,66,44]
    print quick_sort(L)

if __name__=="__main__":
    main()


参考资料:
http://zh.wikipedia.org/zh-cn/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
http://www.cnblogs.com/zabery/archive/2011/07/27/2118353.html
分享到:
评论

相关推荐

    python常用排序算法汇总

    该程序包含7大排序算法: # sort.bubbleSort() #冒泡排序 ...# sort.quickSort() #快速排序 该排序算法把每次的排序结果都列出来,可供初学者学习。 self.arr存放的是待排序列表,可改成自己的数据

    python实现快速排序的几种方法.docx

    ### Python实现快速排序的几种方法 #### 快速排序算法简介 快速排序是一种非常高效的排序算法,采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。该算法的基本思想是:选择一个基准...

    Python快速排序算法实例分析

    以下是一个简单的Python快速排序实现: ```python def quickSort(nums, low, high): if low key = nums[low] while low while low [high] &gt;= key: high -= 1 while low [low] low += 1 nums[low], nums...

    快速排序代码整合集合

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),将一个大问题分解为两个或更多的小问题来解决。在快速排序中,我们选择一个基准元素,...

    quicksort.zip

    在"quicksort.zip"压缩包中的"quicksort-master"目录下,可能包含了C++和Python两种语言实现快速排序的源代码文件。通过阅读和分析这些代码,你可以更深入地理解快速排序的原理和实现细节。对于初学者,这是一个很好...

    Princeton Quicksort

    5. 与其他排序算法的比较:文档中提到了快速排序与归并排序(Mergesort)以及其他多种语言的系统排序算法的比较,如Java对于对象和基本类型的不同排序实现,以及C、Unix、Visual C++、Python、Matlab、Chrome ...

    数据结构与算法分析(Python实现).zip

    常见的算法包括排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序)、搜索算法(如线性搜索、二分搜索和哈希搜索)、图算法(如深度优先搜索和广度优先搜索)、动态规划以及递归算法等。...

    Quicksort-Plain-Python

    在这个项目"Quicksort-Plain-Python"中,我们将会深入探讨如何用纯Python实现快速排序算法。 快速排序的工作原理如下: 1. **选择基准元素(Pivot Selection)**:首先,从数组中选择一个元素作为“基准”(pivot)...

    cs231n课堂笔记翻译pdf版本(python-numpy)

    - 示例中的快速排序算法定义了一个函数,通过递归的方式实现数组排序。 4. Numpy库的使用 - Numpy是Python中用于进行科学计算的一个基础库,它提供了高性能的多维数组对象和这些数组的操作工具。 - Numpy数组的...

    randomized-quicksort

    随机快速排序(Randomized Quicksort)是一种基于分治策略的高效排序算法,它是快速排序的一个变种。在快速排序的原始版本中,选择“枢轴”(pivot)元素是固定或预先确定的,而在随机化版本中,枢轴是通过随机选择...

    Python库 | usort-0.6.2.tar.gz

    `usort`库可能会包含一些高级排序算法,如快速排序(quicksort)、归并排序(mergesort)或堆排序(heapsort)。这些算法相对于Python内置的TimSort算法,在特定场景下可能提供更快的排序速度,尤其是在处理大规模...

    python算法数据结构课程视频含代码之递归1G

    快速排序是一种高效的排序算法,其核心思想是分治法,通过递归不断地分割数组并排序。 ```python def quicksort(arr): if len(arr) 基线条件 return arr pivot = arr[len(arr) // 2] left = [x for x in arr...

    算法题的概要介绍与分析

    快速排序是一种高效的排序算法,采用了分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。快速排序的核心在于如何选择“基准”值,并根据这个基准值将序列分为两部分。在这个例子中,快速...

    py代码-快速排序代码

    此项目提供了一个简单的Python版本快速排序算法。快速排序是一种高效的排序算法,其平均时间复杂度为O(n log n)。 ## 如何使用 1. 打开终端或命令提示符。 2. 将代码下载到本地。 3. 导航到代码文件夹,例如: ```...

    algorithm templates and leetcode examples in Python3, you .zip

    1. **排序算法**:如快速排序(quicksort)、归并排序(mergesort)、插入排序(insertionsort)、选择排序(selectionsort)以及堆排序(heapsort)。它们用于对数据进行有序排列,理解每种算法的时间复杂度和适用...

    Python语法实战指南.docx

    通过实践,你可以创建复杂的程序,解决实际问题,例如快速排序算法的实现: ```python def quicksort(arr): if len(arr) return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x ] middle = [x ...

    实验报告三+15130130273+石明皓1

    实验报告三 - Python基础编程 本实验主要涵盖了Python的基础编程技巧,旨在让学生熟悉Python的编程模式和开发方法,为后续的...这为他们进一步学习Python编程,特别是涉及到并行计算的复杂任务打下了坚实的基础。

    CS231n课程笔记翻译 全 带书签 PDF

    - 文件中给出了一个使用Python实现的经典快速排序算法示例(quicksort)。这不仅展示了Python简洁的语法,也体现了其强大的表达能力。 8. Python和深度学习的关系: - CS231n课程聚焦于深度学习在计算机视觉中的...

    Dahlia:Python实现的算法

    - **排序算法**:如冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等。 - **搜索算法**:如线性搜索、二分搜索、深度优先搜索(DFS)、广度优先搜索(BFS)。 - **图算法**:如最短路径算法(Dijkstra、...

Global site tag (gtag.js) - Google Analytics