三路分区(Three Way Partitioning)算法结果异常问题咨询
问题分析与解答
核心结论
你的三路分区算法逻辑是正确的,问题出在对三路分区的目标理解偏差——你预期中间区间内元素有序,但标准荷兰国旗三路分区仅保证元素落在正确的区域,不保证区域内部元素的顺序。
详细解释
- 三路分区的本质
标准荷兰国旗三指针算法的作用是将数组划分为三个互不重叠的区域:
- 所有
< lowVal的元素在最左侧 - 所有
lowVal ≤ x ≤ highVal的元素在中间 - 所有
> highVal的元素在最右侧
算法只保证元素归属的区域正确,不负责区域内的元素排序。
- 你的测试结果分析
你的算法输出[1, 1, 3, 2, 4, 54, 20, 87, 98, 20, 5, 32, 14]完全符合分区规则:
- 中间区域的
1、1、3、2都满足1 ≤ x ≤ 3,属于正确区间; - 你预期的
[1,1,2,3]是中间区域有序的情况,但这不是三路分区的默认要求。
- 如果需要中间区域有序
若你需要中间区间内的元素保持升序,可在三路分区完成后对中间区间单独排序,修改后的代码如下:
def threeway(self, nums, lowVal, highVal): l, m, r = 0, 0, len(nums) - 1 while m <= r: if nums[m] < lowVal: nums[m], nums[l] = nums[l], nums[m] l += 1 m += 1 elif nums[m] > highVal: nums[m], nums[r] = nums[r], nums[m] r -= 1 else: m += 1 # 对中间区间排序 nums[l:r+1] = sorted(nums[l:r+1]) return nums
运行后将得到你预期的输出,但这会增加额外的排序时间复杂度。
内容的提问来源于stack exchange,提问作者rog05
相关产品推荐
相关产品推荐

