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

快速排序递归实现:如何按要求输出中间分区过程?

快速排序递归分区与中间步骤输出问题

我正在完成学校的快速排序编程练习,已经实现了基础分区功能:给定数组array,以首个元素为pivot,将小于pivot的元素放在左侧、大于的放在右侧,且保留原有相对顺序,输出分区后的数组。对应的Ruby代码如下:

def partition(array)
  pivot = array.shift()
  base = [pivot]
  left = []
  right = []
  array.each do |e|
    if e < pivot
      left.push(e)
    else
      right.push(e)
    end
  end
  left + base + right
end

p partition([4, 5, 3, 9, 1])
# => [3, 1, 4, 5, 9]

新任务要求

现在需要递归调用上述分区逻辑,并按指定格式输出中间过程。示例输入[5, 8, 1, 3, 7, 10, 2]的预期输出为:

2 3
1 2 3
7 8 10
1 2 3 5 7 8 10

我能完成数组排序,但无法满足中间步骤的输出格式要求,尝试了多种代码仍未解决:

尝试1(pivot设为末尾元素)

def partition(array)
    pivot = array[-1]
    i = -1
    j = 0
    while j < array.length-1
        if array[j] < pivot
            i += 1
            array[i], array[j] = array[j], array[i]
        end
        j += 1
    end
    array.insert(i+1, array.pop)
    puts index = i+1
    puts (array.take index).join(' ')
    puts (array.drop index+1).join(' ')
end

partition([5, 8, 1, 3, 7, 10, 2])

尝试2(递归终止条件问题)

def partition(array)
    pivot = array.shift()
    base = [pivot]
    left = []
    right = []
    array.each do |e|
      if e < pivot
        left.push(e)
      else
        right.push(e)
      end
    end
    left + base + right
    if left.length < 2
      return
    end
    partition(left)
end

p partition([5, 8, 1, 3, 7, 10, 2])
p partition([1, 3, 2])
p partition([8, 7, 10])

解决方案

要实现要求的中间步骤输出,需要在递归排序的过程中,每当完成一个子数组的排序(即子数组长度≥2时),就输出该子数组的结果。同时注意递归顺序:先处理左子数组,再处理右子数组,最后输出整个排序后的数组。

以下是符合要求的代码:

def quicksort_with_steps(array)
  # 递归终止条件:数组长度小于2无需排序
  return array if array.length < 2

  pivot = array.shift
  left = []
  right = []

  array.each do |e|
    e < pivot ? left.push(e) : right.push(e)
  end

  # 递归处理左右子数组
  sorted_left = quicksort_with_steps(left)
  sorted_right = quicksort_with_steps(right)

  # 合并结果
  sorted_array = sorted_left + [pivot] + sorted_right

  # 输出中间步骤:仅当当前处理的数组长度≥2时输出
  puts sorted_array.join(' ') if sorted_array.length >= 2

  sorted_array
end

# 调用示例
quicksort_with_steps([5, 8, 1, 3, 7, 10, 2])

代码说明

  1. 递归逻辑:每次将数组分为左、pivot、右三部分,递归排序左右子数组后合并。
  2. 中间输出时机:在合并得到当前子数组的排序结果后,若子数组长度≥2,则输出该数组。这样会先输出左子树的排序结果,再输出右子树的,最后输出整个数组,完全匹配示例的输出顺序。
  3. 保留相对顺序:沿用了你最初的分区逻辑,保证小于pivot的元素相对顺序不变。

运行上述代码,输入[5, 8, 1, 3, 7, 10, 2]会得到预期输出:

2 3
1 2 3
7 8 10
1 2 3 5 7 8 10

内容的提问来源于stack exchange,提问作者PRATAP-PANABAKA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:01:16