You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

快速排序三数取中法疑问:8元素数组如何选取基准?

关于快速排序三数取中在偶数长度数组的实现问题

嘿,这个细节问题抓得很准!我来帮你把三数取中的逻辑彻底理清楚~

首先,你对三数取中的核心理解是对的:从待排序区间的首、尾、中间位置元素里选中位数当基准。关键是当数组长度为偶数时,「中间位置」怎么确定——其实行业内最常用的实现是用整数除法向下取整来计算中间索引,公式一般是:

mid = (low + high) // 2

(这里low是区间的起始索引,high是区间的末尾索引)

拿你给出的8元素数组[34,66,57,45,20,98,92,41]举例:

  • 区间的low是0,high是7
  • 计算中间索引:(0 + 7) // 2 = 3,对应的元素是45
  • 取首元素34、尾元素41、中间元素45,这三个数的中位数确实是45,所以你的判断完全正确,这个场景下基准就选45

再补充个小细节:为什么用整数除法?因为不管数组长度是奇数还是偶数,这个计算方式都能得到一个合法的、不会越界的中间位置。比如9元素数组(索引0-8),(0+8)//2=4,刚好是正中间的索引,和你见过的示例完全匹配。

如果你想看看具体的代码实现思路,这里给一个简单的伪代码片段(以Python风格为例):

def median_of_three(arr, low, high):
    # 计算中间索引
    mid = (low + high) // 2
    # 通过三次交换,把三个数中的中位数放到high位置(方便后续快排基准选取)
    if arr[low] > arr[mid]:
        arr[low], arr[mid] = arr[mid], arr[low]
    if arr[low] > arr[high]:
        arr[low], arr[high] = arr[high], arr[low]
    if arr[mid] > arr[high]:
        arr[mid], arr[high] = arr[high], arr[mid]
    # 返回中位数作为基准
    return arr[high]

这段代码的逻辑是先把三个数排序,把中位数移到区间末尾,然后直接用末尾元素作为快排的基准,这样后续的分区操作就可以沿用常规快排的逻辑了。

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

火山引擎 最新活动