快速排序算法是否保证输出数组中相邻元素曾直接比较?
快速排序是否保证排序后相邻元素曾被直接比较?
结论:不能保证。
我们可以通过简单例子直观证明:
- 待排序数组:
[1, 3, 2, 4],以第一个元素作为基准执行快速排序:- 首次选
1为基准,与3、2、4分别比较,将1放到首位,数组拆分为[]、[1]、[3,2,4]; - 处理子数组
[3,2,4],选3为基准,与2、4分别比较,将3放到正确位置,数组拆分为[2]、[3]、[4]; - 最终排序结果为
[1,2,3,4]。
- 首次选
这里排序后的相邻元素1和2,在整个排序过程中从未直接比较过,但最终成为了相邻元素。
即使是你提到的N=2^k-1的场景(比如k=3,N=7),最优划分的快速排序依然存在这种情况:
- 待排序数组:
[4,1,3,2,6,5,7],每次选中位数作为基准:- 首次选
4为基准,划分出左子数组[1,3,2]和右子数组[6,5,7]; - 左子数组选
3为基准,划分出[1,2];右子数组选6为基准,划分出[5]; - 最终排序结果为
[1,2,3,4,5,6,7],其中1和2从未直接比较过,但排序后相邻。
- 首次选
本质原因是:快速排序的比较逻辑是元素仅会与基准元素直接比较,如果两个元素在某次划分中被基准分到不同的子数组,它们就永远不会有直接比较的机会,但在最终排序结果里,它们完全可能成为相邻元素。
内容的提问来源于stack exchange,提问作者George Robinson
相关产品推荐
相关产品推荐

