【发布时间】:2017-05-13 04:44:33
【问题描述】:
稳定排序讨论了排序后相等的键不会相互超越
考虑数组索引 8 和 9 处的重复键 4,按以下顺序,
a= [5 20 19 18 17 8 4 5 4 4] 其中pivot= 0,i= 1,j= 9分区逻辑说,
i指针从左向右移动。只要a[i]的值≤ 就将i移动到a[pivot]。swap(a[i], a[j])
j指针从右向左移动。只要a[j]的值≥ ,就将j移动到a[pivot]。swap(a[i], a[j])
重复此步骤两次后,
a= [5 4 19 18 17 8 4 5 4 20] 在i= 1 &j= 9 处完成交换。
a= [5 4 19 18 17 8 4 5 4 20] 停在i= 2 &j= 8
a= [5 4 4 18 17 8 4 5 19 20] 在i= 2 &j= 8 完成交换
我的理解是,由于重复键4在两次交换后丢失了顺序,快速排序不是稳定排序。
问题:
据我了解,这是快速排序不稳定的原因吗?如果是,我们是否有任何替代分区方法来维护上面示例中键 4 的顺序?
【问题讨论】:
-
快速排序不是一种稳定的排序——这是肯定的。有一些方法可以使快速排序稳定;它们涉及以某种方式记录行的原始顺序,以便当两个元素比较相等时忽略原始位置,您可以通过使用原始位置信息来判断两者在输出中的顺序。你如何详细地做到这一点是一个更棘手的讨论。您可能可以通过“稳定快速排序”等搜索在网上找到一些东西。
-
@JonathanLeffler 尝试对here 进行稳定排序,但失败了
-
您是否查看过通过搜索“稳定快速排序”找到的关于 SO 的其他问题?有很多。至少有些人会有很好的答案。在那个问题(SO 4171-5443)中,您似乎也得到了一个非常体面的答案。
标签: sorting data-structures language-agnostic quicksort stable-sort