Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';双枢轴快速分拣和快速分拣的区别是什么?_Java_Sorting_Quicksort - Fatal编程技术网

Java 什么';双枢轴快速分拣和快速分拣的区别是什么?

Java 什么';双枢轴快速分拣和快速分拣的区别是什么?,java,sorting,quicksort,Java,Sorting,Quicksort,我以前从未见过双枢轴快速排序。 它是快速排序的升级版吗? 双枢轴快速排序和快速排序之间有什么区别?我在Java文档中找到了这一点 排序算法是一种双枢轴快速排序算法 弗拉基米尔·雅罗斯拉夫斯基、乔恩·本特利和约书亚·布洛赫。该算法 在许多导致其他问题的数据集上提供O(n log(n))性能 快速排序将降级为二次性能,通常是 比传统(单轴)快速排序实现更快 然后我在谷歌搜索结果中找到了这个。 快速排序算法原理: 从数组中拾取一个称为轴的元素 对数组重新排序,使小于轴的所有元素位于轴之前 轴和大于轴的

我以前从未见过双枢轴快速排序。 它是快速排序的升级版吗?

双枢轴快速排序和快速排序之间有什么区别?

我在Java文档中找到了这一点

排序算法是一种双枢轴快速排序算法 弗拉基米尔·雅罗斯拉夫斯基、乔恩·本特利和约书亚·布洛赫。该算法 在许多导致其他问题的数据集上提供O(n log(n))性能 快速排序将降级为二次性能,通常是 比传统(单轴)快速排序实现更快

然后我在谷歌搜索结果中找到了这个。 快速排序算法原理:

  • 从数组中拾取一个称为轴的元素
  • 对数组重新排序,使小于轴的所有元素位于轴之前 轴和大于轴的所有元素位于轴之后(可以使用相等的值) 无论如何)。在这个分区之后,pivot元素处于其最终位置
  • 对较小元素的子数组和较大元素的子数组进行递归排序
  • 相比之下,双枢轴快速排序:

    ()

  • 对于小数组(长度<17),使用插入排序算法
  • 选择两个枢轴元素P1和P2。例如,我们可以得到第一个元素 a[左]为P1,最后一个元素a[右]为P2
  • P1必须小于P2,否则将进行交换。因此,有以下几个部分:
    • 第一部分,索引从左+1到左-1,元素小于P1
    • 第二部分,指数从L到K–1,元素大于或等于P1,小于或等于P2
    • 第三部分,指数从G+1到右侧-1,元素大于P2
    • 第四部分包含要用从K到G的指数检查的其余元素
  • 将第四部分中的下一个元素a[K]与两个枢轴P1和P2进行比较, 并置于相应的第一、二或三部分
  • 指针L、K和G在相应的方向上改变
  • 在K时重复步骤4-5≤ G
  • 枢轴元件P1与第一部分的最后一个元件交换, 枢轴元件P2与第三部分中的第一个元件互换
  • 对于每个第一部分、第二部分和第三部分,递归地重复步骤1-7

  • 对于感兴趣的人,请看一下他们是如何在Java中实现此算法的:

    如资料来源所述:

    “如果可能合并,请使用给定的工作区数组切片对数组的指定范围进行排序


    该算法在许多数据集上提供O(n log(n))性能,这些数据集会导致其他快速排序降级为二次性能,并且通常比传统(单轴)快速排序实现更快。”

    我只想从算法的角度补充一点(即成本仅考虑比较和交换的数量),2轴快速排序和3轴快速排序即使不差,也不比经典快速排序(使用1轴)好。 然而,它们在实践中更快,因为它们利用了现代计算机体系结构的优点。具体来说,它们的缓存未命中数更小。所以,如果我们删除所有缓存,只有CPU和主内存,在我的理解中,2/3-pivot快速排序比经典的快速排序更糟糕

    参考资料: 3轴快速排序: 分析其性能优于经典快速排序的原因:
    完整且不太详细的参考资料:

    非常感谢。我得到了正确的答案。@GregHewgill非常感谢。我得到了正确的答案。@GregHewgill当我有这个问题并搜索Google时,它把我带到了这里。我很高兴Barrody_JL问了这个问题,其他人也回答了这个问题!:)这就是为什么我们非常感谢Java库设计人员,我们不必实现我们自己的排序算法,否则我们都将使用冒泡排序;-)在步骤7之后和步骤8之前,可以将P1与P2进行比较。如果它们是相同的值,这意味着第二部分不需要排序,它们是P1和P2的重复项。为什么17用于插入排序。它是任意的吗?@abksrv,MergeSort是
    O(n logn)
    ,InsertionSort是
    O(n^2)
    ,然而这实际上是
    C1*n*log(n)
    C2*n*n
    (其中C1和C2是一些常量)。当
    n
    较大时,常数不相关。当
    n
    较小时,它们可能是相关的。据推测,实施者调查发现17是临界点:
    C1*log(17)>C2*17
    ,但
    C1*log(18)
    。雅罗斯洛夫斯基的原始论文()将27而不是17设置为使用插入排序的阈值。另一方面,Yaroslovsky、Bentley和Bloch()在Java8中的实现使用47作为阈值。可能是这里最好的。最后一个链接已过时。你还有文件吗?你可以在这里找到所有更新的课程: