当前位置: 首页 > 知识库问答 >
问题:

了解快速排序

东方修谨
2023-03-14

我很难理解quicksort,大多数演示和解释都忽略了实际发生的事情(例如http://me.dt.in.th/page/quicksort/)。

维基百科说:

从数组中选择一个称为透视的元素。分区:对数组重新排序,使所有值小于pivot的元素都在pivot之前,而所有值大于pivot的元素都在pivot之后(相等的值可以从任何一个方向走)。分区后,枢轴处于其最终位置。这称为分区操作。将上述步骤递归应用于具有较小值的元素的子数组,并单独应用于具有较大值的元素的子数组。

共有1个答案

董嘉祯
2023-03-14

快速排序步骤如下:

  • 从列表中选择一个称为透视的元素。
  • 对列表重新排序,使所有值小于透视的元素都在透视之前,而所有值大于透视的元素都在透视之后(相等的值可以从任何一个方向移动)。分区后,枢轴处于其最终位置。这称为分区操作。
  • 递归排序较小元素的子列表和较大元素的子列表。递归的基本情况是大小为0或1的列表,它们从不需要排序。

Lomuto分区方案

    null
algorithm partition(A, lo, hi) is
    pivot := A[hi]
    i := lo        // place for swapping
    for j := lo to hi – 1 do
        if A[j] ≤ pivot then
            swap A[i] with A[j]
            i := i + 1
    swap A[i] with A[hi]
    return i
algorithm quicksort(A, lo, hi) is
    if lo < hi then
        p := partition(A, lo, hi)
        quicksort(A, lo, p – 1)
        quicksort(A, p + 1, hi)

>

  • 使用两个索引,它们从被分区html" target="_blank">数组的末尾开始,然后相互移动,直到它们检测到倒置:一对元素,一个比枢轴大,一个比枢轴小,它们之间的顺序不对。然后交换反转的元素。

    该算法有许多变体,例如,从[hi]而不是[lo]中选择pivot

    分区算法(使用Hoare分区方案)

    algorithm partition(A, lo, hi) is
        pivot := A[lo]
        i := lo – 1
        j := hi + 1
        loop forever
            do
                i := i + 1
            while A[i] < pivot
    
            do
                j := j – 1
            while A[j] > pivot
    
            if i >= j then
                return j
    
            swap A[i] with A[j]
    
    algorithm quicksort(A, lo, hi) is
        if lo < hi then
            p := partition(A, lo, hi)
            quicksort(A, lo, p)
            quicksort(A, p + 1, hi)
    

    >

  • 算法的执行速度很大程度上取决于这种机制是如何实现的,差的实现可以假设算法以慢的速度运行。

    pivot的选择决定了数据列表的分区,因此,这是Quicksort算法实现中最关键的部分。重要的是要尽量使选择的透视左分区和右分区的大小相同。

    最佳和最坏情况

    形式分析

    • 最差情况分析=O(N²)
    • 最佳情况分析=O(n)因子
    • 平均情况分析=O(n log n)

    示例来源

    def quicksort(array):
        less = []
        equal = []
        greater = []
        if len(array) > 1:
            pivot = array[0]
            for x in array:
                if x < pivot:
                    less.append(x)
                if x == pivot:
                    equal.append(x)
                if x > pivot:
                    greater.append(x)
            return sort(less)+equal+sort(greater)  
        else: 
            return array
    
    quicksort([12,4,5,6,7,3,1,15])
    
    def partition(array, begin, end):
        pivot = begin
        for i in xrange(begin+1, end+1):
            if array[i] <= array[begin]:
                pivot += 1
                array[i], array[pivot] = array[pivot], array[i]
        array[pivot], array[begin] = array[begin], array[pivot]
        return pivot
    
    def quicksort(array, begin=0, end=None):
        if end is None:
            end = len(array) - 1
        if begin >= end:
            return
        pivot = partition(array, begin, end)
        quicksort(array, begin, pivot-1)
        quicksort(array, pivot+1, end)
    
    quicksort([97, 200, 100, 101, 211, 107])
    

      null

  •  类似资料:
    • 本文向大家介绍快速了解Maven,包括了快速了解Maven的使用技巧和注意事项,需要的朋友参考一下 也许是本人不才,初识Maven时,被各种不明所以的教程搞得一头雾水,而在后来的使用中,我发现Maven大部分功能没有想象的那么困难。 本片文章面向Maven初学者,希望能让其以最快的速度了解Maven并享受到它所带来的一系列好处。 [一个简单的问题] 在进行讲解前,先提问一个简单的问题。 假如你正在

    • 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不

    • 本文向大家介绍JS排序之快速排序详解,包括了JS排序之快速排序详解的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了JS快速排序的具体代码,供大家参考,具体内容如下 说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在b的前面,排序后可能会交换位置 --JS快速排序--

    • 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两

    • 1. 前言 本节内容是排序算法系列之一:快速排序,主要讲解了快速排序的主体思路,选取了一个待排序的数字列表对快速排序算法进行了演示,给出了快速排序算法的 Java 代码实现,帮助大家可以更好地理解快速排序算法。 2. 什么是快速排序? 快速排序(Quick Sort),是计算机科学与技术领域中非常经典的一种排序算法,应用分治思想进行排序。 快速排序由于其时间复杂度优于大部分的排序算法,因而命名为快

    • 营销通是纷享销客为企业市场营销管理提供从获客到成交的营销一体化方案。 纷享营销一体化核心业务流程: 纷享营销一体化方案价值: 1. 渠道投放效果跟踪 接入企业现有的营销获取渠道,通过统一线索管理视图、线索工作台,识别线索来源, 评估渠道线索产出,帮助企业优化渠道配置,提高现有渠道的获客效率。 2. 精细化线索管理 识别线索来源、重复线索处理、质量评估、分配流转可视化数字化管理,帮助市场部跟踪从各个