我是否正确地说,在两种算法中,你所做的只是采用你的结构,递归地将它分成两部分,然后以正确的顺序构建你的结构?
那么,有什么区别?
编辑:我在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;
}
答案 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)