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

快速排序效率:扫描方向重要吗?

姚昊焱
2023-03-14

下面是我对一个就地快速排序算法的实现,这是从这段视频改编的:

def partition(arr, start, size):
    if (size < 2):
        return
    index = int(math.floor(random.random()*size))
    L = start
    U = start+size-1
    pivot = arr[start+index]
    while (L < U):
        while arr[L] < pivot:
            L = L + 1
        while arr[U] > pivot:
            U = U - 1
        temp = arr[L]
        arr[L] = arr[U]
        arr[U] = temp

    partition(arr, start, L-start)
    partition(arr, L+1, size-(L-start)-1)

似乎有几种扫描步骤的实现,其中数组(或数组的当前部分)被分成3个段:低于枢轴的元素、枢轴和大于枢轴的元素。我从左边扫描大于或等于枢轴的元素,从右边扫描小于或等于枢轴的元素。一旦找到每一个,就进行交换,循环继续,直到左标记等于或大于右标记。然而,在此图之后还有另一种方法,在许多情况下会导致更少的分区步骤。有人能验证一下对于quicksort算法,哪种方法实际上更有效率吗?

共有1个答案

夏飞掣
2023-03-14

你使用的两种方法基本上是一样的。在上述代码中

index = int(math.floor(random.random()*size))

索引是随机选择的,所以它可以是第一个元素,也可以是最后一个元素。在https://s3.amazonaws.com/hr-challeng-images/quick-sort/quicksortinplace.png链接中,它们通常将最后一个元素作为pivot,并以与代码中相同的方式移动。

所以这两种方法是相同的。在您的代码中,您随机选择了枢轴,在图像中-您声明了枢轴。

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

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

  • 5.12.快速排序 快速排序使用分而治之来获得与归并排序相同的优点,而不使用额外的存储。然而,作为权衡,有可能列表不能被分成两半。当这种情况发生时,我们将看到性能降低。 快速排序首先选择一个值,该值称为 枢轴值。虽然有很多不同的方法来选择枢轴值,我们将使用列表中的第一项。枢轴值的作用是帮助拆分列表。枢轴值属于最终排序列表(通常称为拆分点)的实际位置,将用于将列表划分为快速排序的后续调用。 Figu

  • 最新的博客地址:我的最新博客 定义 快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序 n 个项目要 O(nlogn) 次比较。在最坏状况下则需要 O(n^2) 次比较,但这种状况并不常见。事实上,快速排序 (nlogn) 通常明显比其他算法更快,因为它的内部循环(inner l

  • 我有一个方法来输出最高值,最低值,平均值,我需要一个排序方法。我曾试图提出所谓的“冒泡法”,但并不奏效。有人知道我可以使用的其他排序方法吗?

  • 快速排序,这是一个经典的算法,本文给出几种python的写法,供参考。 特别是python能用一句话实现快速排序。 思路说明 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 (1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解