quicksort和mergesort有什么区别?

时间:2011-04-19 10:12:08

标签: sorting quicksort mergesort

我是否正确地说,在两种算法中,你所做的只是采用你的结构,递归地将它分成两部分,然后以正确的顺序构建你的结构?

那么,有什么区别?

编辑:我在quicksort中找到了以下用于实现分区的算法,但我真的不明白它是如何工作的,特别是使用(hi + low) >>> 1作为参数的swop行!任何人都可以理解这个吗?

private static int partition( int[] items, int lo, int hi ) 
{
    int destination = lo;
    swop( items, (hi + lo) >>> 1, hi );
    // The pivot is now stored in items[ hi ].
    for (int index = lo; index != hi; index ++) 
    {
        if (items[ hi ] >= items[ index ]) 
        {
            // Move current item to start.
            swop( items, destination, index );
            destination ++;
        }

        // items[ i ] <= items[ hi ] if lo <= i < destination.
        // items[ i ] > items[ hi ] if destination <= i <= index.
    }

    // items[ i ] <= items[ hi ] if lo <= i < destination.
    // items[ i ] > items[ hi ] if destination <= i < hi.
    swop( items, destination, hi );
    // items[ i ] <= items[ destination ] if lo <= i <= destination.
    // items[ i ] > items[ destination ] if destination < i <= hi.
    return destination;
}

6 个答案:

答案 0 :(得分:21)

  

我是否正确地说,在两种算法中,你所做的只是采用你的结构,递归地将它分成两部分,然后以正确的顺序构建你的结构?

是。然而,不同之处在于结构以正确的顺序构建。在Quicksort中,实际的排序步骤在拆分过程中完成(将元素移动到左侧或右侧,取决于与枢轴元素的比较),并且没有合并步骤来重新启动树(从数据点观察)视图;你的实现当然可以有堆栈展开),而在Mergesort中,排序是在上升的过程中完成的 - 拆分步骤根本不移动元素,但在备份的过程中,你需要合并两个排序的列表

至于性能比较:Quicksort的最坏情况行为肯定比Mergsesort差,但是平均情况的常数因素(几乎完全在实践中被观察到)更小,这使得Quicksort通常是通用,未排序输入的赢家。并不是很多人需要自己实现通用排序例程......

答案 1 :(得分:8)

在最坏的情况下,quicksort将具有O(n ^ 2),其中mergesort将为O(n * log n)

Quicksort使用一个数据透视表,并以枢轴作为参考点对这两个部分进行排序,并存在枢轴将是已排序数组的最大值或最小值的风险。如果您将选择错误的支点,您将最终得到复杂性n ^ 2(n ^ 2比较)

命名的Mergesort基于递归地将数组分成相同大小的一半并将它们合并。例如,对wikipedia的相当不错的解释。特别是带有树状刹车的图片似乎很好地解释了它。

答案 2 :(得分:4)

Quicksort有一个糟糕的坏情况,而Mergesort总是保证O(n log n),但在实践中典型的Quicksort实现比Mergesort更快。

此外,Mergesort需要额外的存储空间,这在许多情况下都是一个问题(例如库例程)。这就是Quicksort几乎总是被库例程使用的原因。

  

编辑:我发现了以下内容   实现的算法   快速分配,但我没有   真的明白它是如何工作的,   特别是使用的swop线   (hi + low)&gt;&gt;&gt; 1作为参数!

这取高和低的平均值,相当于(hi + low)/ 2。

答案 3 :(得分:2)

底层数据结构的实现细节也是一个因素,如高效的随机访问(quicksort需要),数据结构的可变性会对内存需求产生影响(特别是mergesort)

答案 4 :(得分:0)

是的,Quicksort和Mergesort都是divide-and-conquer algorithms

Wikipedia's Quicksort page进行了简短比较:

  

Quicksort也与之竞争   mergesort,另一种递归排序   算法,但有利于   最坏情况下的O(n log n)运行时间。   Mergesort是一种稳定的类型,不像   quicksort和heapsort,可以   很容易适应关联的操作   存储的列表和非常大的列表   磁盘等访问速度很慢的媒体   存储或网络附加存储。   虽然可以写入快速排序   它经常在链表上运行   如果没有糟糕的枢轴选择   随机访问。主要缺点   mergesort是在运营时   在数组上,它需要O(n)辅助   空间在最好的情况下,而   快速排序的变体与就地   分区和尾递归使用   只有O(log n)空间。 (注意,当   在链表上运行,mergesort   只需要一个小的,恒定的数量   辅助存储。)

答案 5 :(得分:-1)

http://en.wikipedia.org/wiki/Sorting_algorithm您可以快速了解常见的排序算法。 Quicksort和Mergesort是前两个;)

有关详细信息,请阅读每种算法的信息。 正如Jan所说,Mergesort总是复杂的O(n * log n)和Quicksort在最坏的情况下达到O(n ^ 2)