Alb*_*s32 5 sorting mergesort quicksort
我是否正确地说,在两种算法中,您所做的只是采用您的结构,递归地将其分成两部分,然后以正确的顺序构建您的结构?
那么区别是什么呢?
编辑:我发现了以下算法在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;
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*zig 22
我是否正确地说,在两种算法中,您所做的只是采用您的结构,递归地将其分成两部分,然后以正确的顺序构建您的结构?
是.然而,不同之处在于结构以正确的顺序构建.在Quicksort中,实际的排序步骤在拆分过程中完成(将元素移动到左侧或右侧,取决于与枢轴元素的比较),并且没有合并步骤来重新启动树(从数据点观察)视图;你的实现当然可以有堆栈展开),而在Mergesort中,排序是在上升的过程中完成的 - 拆分步骤根本不移动元素,但在备份的过程中,你需要合并两个排序的列表.
至于性能比较:Quicksort的最坏情况行为肯定比Mergsesort差,但是平均情况的常数因素(几乎完全在实践中观察到的)较小,这使得Quicksort通常是通用,未分类输入的赢家.并不是很多人需要自己实现通用排序例程......
| 归档时间: |
|
| 查看次数: |
35868 次 |
| 最近记录: |