以中间元素为基准的快速排序

2024-01-07

我对快速排序的理解是

  1. 选择一个枢轴元素(在本例中我选择中间元素作为 枢)
  2. 在极值处初始化左指针和右指针。
  3. 找到枢轴左侧第一个大于枢轴的元素。
  4. 同样找到枢轴右侧第一个小于枢轴的元素
  5. 交换 3 和 4 中的元素。
  6. 重复 3,4,5,除非左 >= 右。
  7. 对左右子数组重复整个过程,因为现在将枢轴放置在其位置上。

我确信我在这里遗漏了一些东西并且非常愚蠢。但上面似乎不适用于这个数组:

  8,7,1,2,6,9,10,2,11 pivot: 6  left pointer at 8, right pointer at 11
  2,7,1,2,6,9,10,8,11 swapped 2,8  left pointer at 7, right pointer at 10

怎么办 ?它的右边没有小于6的元素。 7 如何走到 6 的右边?


左侧和右侧之间没有预先划分。特别是,6 不是除法。相反,除法是将左指针和右指针彼此靠近直至相遇的结果。结果可能是一侧比另一侧小得多。

你对算法的描述很好。没有任何地方说你必须停在中间元素。只需继续按照给定的方式执行即可。

顺便说一句:在排序过程中,枢轴元素可能会移动。继续与 6 进行比较,即使它已被移动。

Update:

您对算法的描述确实存在一些小问题。一是步骤 3 或步骤 4 需要包含以下元素:equal到枢轴。让我们像这样重写它:

我对快速排序的理解是

  1. 选择一个枢轴值(在本例中,选择中间元素的值)
  2. 在极值处初始化左指针和右指针。
  3. 从左指针开始向右移动,找到第一个大于或等于主元值的元素。
  4. 同样,从右指针开始向左移动,找到第一个元素,即 小于主元值
  5. 交换 3 和 4 中的元素。
  6. 重复3、4、5,直到左指针大于或等于右指针。
  7. 对左指针左侧和右侧的两个子数组重复整个过程。
pivot value: 6, left pointer at 8, right pointer at 11
8,7,1,2,6,9,10,2,11 left pointer stays at 8, right pointer moves to 2
2,7,1,2,6,9,10,8,11 swapped 2 and 8, left pointer moves to 7, right pointer moves to 2
2,2,1,7,6,9,10,8,11 swapped 2 and 7, left pointer moves to 7, right pointer moves to 1
pointers have now met / crossed, subdivide between 1 and 7 and continue with two subarrays
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以中间元素为基准的快速排序 的相关文章

  • Numpy argsort 不稳定

    最近我一直在尝试np argsort我发现了一些奇怪的事情 如果运行以下代码 您将得到结果 In 0 np argsort 3 16 Out 0 array 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dty
  • 对已经排序的数组进行快速排序

    在这个问题中 https www quora com What is randomized quicksort 阿莱霍 豪斯纳 Alejo Hausner 说道 最坏情况下快速排序的成本 that 讽刺的是 如果您将快速排序应用于已经排序的
  • 使用第二个元素作为基准的 Prolog 快速排序

    我一直在尝试学习序言 我想使用列表的第二个元素作为快速排序的枢轴 我想使用 头 枢轴 Tail 作为方法中的输入可以工作 但后来我不确定可以在哪里放置第一个元素 Head 像这样 qsort qsort Head Pivot Tail So
  • 为什么 Android/Java API 中的对象要使用合并排序?

    In Java 数组 sort 对于原始类型使用快速排序 另一方面数组 sort 对于对象使用归并排序 并且 同样适用于集合 sort 它也使用归并排序 集合排序使用底层的数组排序实现 因此 从简单的意义上来说 我可以说基元是使用快速排序来
  • stable_partition 如何成为自适应算法?

    stable partition是c STL算法头文件中的函数模板 我读到它是一种自适应算法 其时间复杂度为 O n logn 或 O n 具体取决于某些因素 有人可以解释一下这些因素是什么以及时间复杂度如何取决于这些因素 谢谢 有2 实施
  • 3 次划分的中位数

    我找到了以下代码 用于使用第一个 最后一个和中间元素的中值查找快速排序的枢轴 int middle low high 2 if a middle compareTo a low lt 0 swapReferences a low middl
  • 使用 qsort 对 2D 数组进行排序

    我正在尝试对二维数组进行排序 首先我按列排序 然后按行排序 逐列有效 但逐行无效 这段代码有什么问题 int scmpr const void a const void b return strcmp const char a const
  • 快速排序 (Java) 在 array.length > 60k 时导致 StackOverFlow

    我的代码可以正常工作 据我所知 直到我的输入数组大小 a length 大约是 62 000 此时我始终得到StackOverFlowError 我之前使用过两次递归调用quicksort 小于和大于枢轴q 然后我切换到尾递归 正如您所看到
  • 用C语言编写的快速排序

    我正在阅读 K R 的 ANSI C 我遇到了 qsort 程序 我需要一点帮助 假设我有 9 个元素 索引为 0 gt 8 请阅读评论 看看我的理解是否正确 非常感谢你的努力 void qsort int v int left int r
  • Java:赛车数组.sort

    我对 QuickSort 进行了一些改进 并决定针对 Java 进行测试Arrays sort 结果很有趣 在 Java 6 上 我的时间 系统时间 74 83 0 891566265060241 我的时间 系统时间 75 79 0 949
  • 以中间元素为基准的快速排序

    我对快速排序的理解是 选择一个枢轴元素 在本例中我选择中间元素作为 枢 在极值处初始化左指针和右指针 找到枢轴左侧第一个大于枢轴的元素 同样找到枢轴右侧第一个小于枢轴的元素 交换 3 和 4 中的元素 重复 3 4 5 除非左 gt 右 对
  • 为什么在快速排序中选择随机主元

    So choosing a pivot at random has O n2 running at worst case but when the pivot is chosen as the average of min value an
  • 是否可以只通过一次就对列表进行快速排序?

    我正在学习haskell 我看到的函数定义是 quickSort x xs quickSort less x equal quickSort more where less filter lt x xs equal filter x xs
  • 快速排序 - 使其稳定的条件

    如果排序算法保留具有 equals 键的任意两个元素的相对顺序 则该算法是稳定的 快速排序在什么条件下稳定 当没有项被传递时 快速排序是稳定的 除非它具有较小的键 还有哪些条件可以使其稳定 嗯 使用 O N 空间而不是就地不稳定实现使用的
  • 这里使用尾递归有什么好处?

    我一直在阅读描述如何通过使用尾递归版本来降低快速排序的空间复杂度的文章 但我无法理解这是怎么回事 以下是两个版本 QUICKSORT A p r q PARTITION A p r QUICKSORT A p q 1 QUICKSORT A
  • 快速排序特殊情况 - 似乎是 K&R 的错误算法

    我在理解 K R 的快速排序算法 没有指针的简化版本 时遇到问题 Dave Gamble 已经在这里提供了详尽的解释解释 https stackoverflow com questions 1231254 kr qsort example
  • 3路快速排序(C实现)

    我试着实施 https github com p1v0t Sort一些算法是使用 C 的纯通用算法 我坚持使用 3 路快速排序 但不知何故 实现没有给出正确的输出 输出几乎已排序 但某些键不在应有的位置 代码如下 提前致谢 include
  • 快速排序和调整快速排序有什么区别?

    快速排序和调整快速排序之间的根本区别是什么 快速排序有何改进 Java 如何决定使用它而不是合并排序 正如蜥蜴比尔所说 调整的快速排序仍然具有与基本快速排序相同的复杂性 O N log N 平均复杂度 但调整的快速排序使用一些不同的方法来尝
  • 查找数组中的 K 个最小值(堆 vs QuickSelect)

    假设我们有一个数组 我们希望找到它的 K 个最小值 有两种方法 1 使用快速选择算法 O n 时间复杂度和O 1 空间 2 使用最小堆数据结构 O NlogK 时间复杂度和O K 空间 我想知道什么时候一个比另一个更受青睐 我想这两个都可以
  • 使用快速排序查找数组中第 k 个最小的项 => 预期运行时间?

    如果我使用快速排序的修改版本来查找数组中第 k 个最小的项目 为什么预期运行时间是 O n 如 Programming Pearls 一书中所述 我正在使用的算法执行以下操作 1 Runs quick sort on the array 2

随机推荐