快速排序选择枢轴值的三种策略的中位数是多少?
我正在网上阅读它,但我无法弄清楚到底是什么?以及它比随机快速排序更好的地方。
中位数为3,您可以查看数组的第一个,中间和最后一个元素,然后选择这三个元素的中位数作为枢轴。
要获得三位数的“完全效果”,对这三个项目进行 排序 也很重要,不仅要将中位数用作支点- 这不会影响当前迭代中选择的支点,但可以/将影响下一个递归调用中用作枢轴的内容,这有助于限制一些初始排序的不良行为(在许多情况下,经过排序的数组在很多情况下特别糟糕,除了在数组中具有最小的元素之外)数组的高端(或最大的元素位于低端),例如:
与随机选择枢纽相比:
第二点可能需要更多解释。如果您使用了明显的(rand())随机数生成器,那么对于某人来说,布置元素非常容易(无论如何,在很多情况下),因此它将不断选择不良的枢轴。对于像Web服务器之类的东西,可能正在对可能由攻击者输入的数据进行排序的事情,这可能是一个严重的问题。攻击者可能使服务器浪费大量时间对数据进行排序,从而发动DoS攻击。在这种情况下,您 可以 使用真正的随机种子,或者可以包含自己的PRNG而不是使用rand();或者使用中位数为3,这还具有其他优点。
rand()
另一方面,如果您使用足够随机的生成器(例如,硬件生成器或计数器模式下的加密),则强制坏账的难度可能比选择三个位数的中位数 要 困难得多。同时,达到该级别的随机性通常会有相当多的开销,因此,除非您真的希望在这种情况下受到攻击,否则可能不值得(而且如果这样做,则至少值得考虑一下保证O(N log N)最坏情况的替代方案,例如合并排序或堆排序。