排序算法之:循环不变式在 Strand Sort 中的正确性证明
字数 1785 2025-11-07 12:32:50
排序算法之:循环不变式在 Strand Sort 中的正确性证明
题目描述
Strand Sort 是一种基于归并策略的排序算法,其核心思想是反复从原列表中提取已排序的“ Strand ”(连续递增子序列),并将这些 Strand 归并到结果列表中。要求使用循环不变式严格证明 Strand Sort 的正确性,即证明算法在每一步执行后均保持部分有序性,且最终得到完整有序序列。
解题过程
1. Strand Sort 算法步骤回顾
- 初始化:结果列表
result为空,待排序列表list包含原始数据。 - 循环执行以下步骤直到
list为空:
a. 从list中提取一个 Strand(从左到右扫描,选择连续递增的最大子序列)。
b. 将 Strand 与result归并(类似归并排序的合并操作)。
c. 从list中删除已提取的 Strand 元素。
示例(辅助理解):
初始列表:[5, 2, 9, 1, 5, 6]
- 第1轮 Strand:
[5, 9](提取后list剩余[2, 1, 5, 6]),与result=[]归并得result=[5, 9]。 - 第2轮 Strand:
[2, 5, 6](剩余[1]),与result=[5,9]归并得[2,5,5,6,9]。 - 第3轮 Strand:
[1],归并后得最终结果[1,2,5,5,6,9]。
2. 定义循环不变式
设算法第 k 轮迭代开始时(k≥0):
- 不变式 P(k):
result是已排序的列表。result中的所有元素均来自原列表,且其顺序与原列表中的相对顺序一致(稳定性)。- 对于
list中剩余的任何元素x和result中的任何元素y,若x在原列表中位于y之后,则x ≥ result的最后一个元素(确保后续 Strand 的最小值不小于result的尾部)。
3. 初始状态(k=0)
result为空,条件1和2自然满足。- 条件3中“
result的最后一个元素”不存在,可视为负无穷,因此条件3成立。 - 结论:P(0) 成立。
4. 保持性(第 k 轮迭代)
假设 P(k) 成立,需证明执行第 k 轮后 P(k+1) 仍成立:
- 步骤a(提取 Strand):
Strand 是list的连续递增子序列,且其首元素是list的当前首元素(扫描从左侧开始)。根据 P(k) 的条件3,Strand 的首元素 ≥result的最后一个元素(若result非空)。 - 步骤b(归并 Strand 与 result):
- 由于 Strand 有序且
result有序,归并操作生成的新result仍有序(归并排序的合并性质)。 - 归并时若元素相等,优先取
result中的元素(因 Strand 来自原列表中更靠后的位置),保持稳定性。
- 由于 Strand 有序且
- 步骤c(删除 Strand):
- 剩余
list中的元素可能比 Strand 中的元素小,但根据 Strand 提取规则(取连续递增序列),剩余元素中任何未提取的x必然小于 Strand 中某个已提取的元素,且由于 Strand 的最小值 ≥result的旧尾部,新result的尾部变为 Strand 的尾部(最大值)。因此,剩余list中的任何x均 ≥ 新result的尾部(否则x会被包含在 Strand 中)。
- 剩余
- 结论:P(k+1) 成立。
5. 终止条件
- 循环终止时
list为空,所有元素已归并到result。 - 根据 P(k) 的条件1,
result有序,且条件2保证稳定性。 - 因此算法正确输出完整有序列表。
6. 总结
通过循环不变式证明了 Strand Sort 的以下性质:
- 每轮迭代后
result保持有序性和稳定性。 - 归并操作确保 Strand 的最小值不低于
result的当前最大值,避免破坏整体有序性。 - 最终
list为空时,result即为原列表的排序结果。