You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

快速排序不同基准规则下8元素数组最大最小交换次数求解

快速排序交换次数极值问题解答

以下推导默认基于通用的Lomuto升序分区实现,有效交换仅统计i≠j的跨位置交换,自交换不计入统计。


问题1:首元素为pivot时8元素最大交换次数数组及推导

核心推导逻辑

要最大化交换次数,需要满足两个核心条件:

  1. 每次分区中,所有大于pivot的元素全部排在小于pivot的元素前面:此时每遇到一个小于pivot的元素,都会触发一次i<j的有效交换,避免i与j同步导致的无意义自交换。
  2. 每次选择当前子数组的次大值作为pivot:此时小于pivot的元素数量最多,能触发最多的循环内交换;同时分区后左半区长度为k-2、右半区长度为1,后续左半区还能持续产生大量交换,避免pivot为最大值时仅触发1次交换的低效率情况。

数组构造过程

按递归规则构造:f(k) = [k-1, k] + f(k-2)

  • k=2时最大交换数组为[2,1]
  • k=4时:次大值3 + 最大值4 + k=2的最大数组 → [3,4,2,1]
  • k=6时:次大值5 + 最大值6 + k=4的最大数组 → [5,6,3,4,2,1]
  • k=8时:次大值7 + 最大值8 + k=6的最大数组 → [7,8,5,6,3,4,2,1]

验证

该数组总有效交换次数为19次,远高于逆序数组的7次,是8元素下的最大交换数组(同交换次数的数组可能有多个,该构造为其中一种有效解)。


问题2:尾元素为pivot时8元素最小交换次数数组及推导

核心推导逻辑

要最小化交换次数,需要让每次分区不触发任何有效交换:
升序排列的数组每次选尾元素为pivot时,pivot都是当前子数组的最大值,所有元素都小于等于pivot且已经按顺序排列在左半区,循环中i与j同步,仅触发自交换(不计入有效交换),最后pivot的位置就是当前尾位置,也不需要跨位置交换。

最终数组

你给出的[1,2,3,4,5,6,7,8]完全正确,总有效交换次数为0,是理论最小值,没有其他数组能达到更低的交换次数。


内容的提问来源于stack exchange,提问作者gokbeykeskin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:06:03