快速排序算法为什么不稳定?我觉得是稳定的
算法吧
全部回复
仅看楼主
level 1
353948024 楼主
无法理解 比如一个数列
B(1) B(2) A(1) A(2) C D
第一次 选 B(1) 做主元,小于B的移动到左边,移动后就是 A(1) A(2) B(1) B(2) C D
左边第二次 针对 A(1) A(2) 主元是A(1),小于A(1)的没有
左边第三次 针对 A(2) 一个元素,返回,所以左边是 A(1) A(2)
右边第二次 针对 B(2) C D 主元是 B(2),无需移动
右边第三次 针对 C D 主元是 C,无序移动
右边第四次 针对 D 一个元素,返回,右边是 B(2) C D
合并 左边 ( A(1) A(2) ) + 主元 ( B(1) ) + 右边 ( B(2) C D ) = A(1) A(2) B(1) B(2) C D
相对顺序完全没有变化啊
只有随机快排才不稳定吧?
2016年09月01日 12点09分 1
level 8
比较的时候小于和小于等于的区别吧
2016年09月01日 16点09分 2
level 11
【坟贴】
在划分的时候,是交换,而不是移动。
题主的例子:B(1) B(2) A(1) A(2) C D
按你要求,左区间严格小于B(1),有区间大于等于B(1)。
【第一种方案】
划分过程如下:以B(1)为准,
左边开始往右找,找到B(1)不小于B(1);右边向左找,找到A(2)小于B(1)。交换之,得到
A(2) B(2) A(1) B(1) C D
左边继续往右,发现B(2)大于等于B(1);右边继续向左,发现A(1)小于B(1)。交换之,得到
A(2) A(1) B(2) B(1) C D
此时,左边两边碰头了。划分完毕。即
[A(2) A(1)] [B(2) B(1) C D]
【第二种方案】
以B(1)为准。先把B(1)抠出来。即 __ B(2) A(1) A(2) C D
从右边开始找,找一个小于B(1)的。于是,找到A(2)。放到空位置上
A(2) B(2) A(1) __ C D
从左边向右找,找到一个大于等于B(1)的,即B(2)。放到空位置上
A(2) __ A(1) B(2) C D
继续从右向左找,找到小于B(1)的,即A(1),放到空位置上
A(2) A(1) __ B(2) C D
左右碰头了。把抠出来的B(1)放到空位置,划分完毕
[A(2) A(1)] [B(1) B(2) C D]
显然,这种交换是不稳定的。
2018年01月07日 18点01分 5
level 1
冒泡法
2018年01月10日 05点01分 6
1