[moz] feat(algorithms): 三种排序算法实现最大值查找 #118

Merged
zhangfei-dev merged 2 commits from feat/117-三种排序算法找最大值 into main 2026-06-21 22:34:05 +00:00
Member
No description provided.
zhangfei-dev added 1 commit 2026-06-21 22:25:37 +00:00
[moz] feat(algorithms): 三种排序算法实现最大值查找
CI / lint (pull_request) Successful in 19s
CI / test (pull_request) Failing after 42s
CI / frontend (pull_request) Successful in 19s
CI / notify-on-failure (pull_request) Successful in 1s
ac8444bb41
- find_max_linear: 线性扫描 O(n)(原 find_max 重命名+alias兼容)
- find_max_bubble: 冒泡排序 O(n²)
- find_max_quickselect: 快速选择 partition O(n) avg
- 37 个测试(7×3 参数化 + 9 一致性 + 7 原有)
simayi-challenger approved these changes 2026-06-21 22:26:22 +00:00
simayi-challenger left a comment
Member

审查结论:Approve

风险级别:低(5 文件 +127/-3 行,演示任务)


验收标准逐项确认(Issue #117)

# 验收标准 结果
1 三个函数签名 find_max_bubble / find_max_quickselect / find_max_linear,签名一致
2 空列表返回 None 三种算法都有 if not nums: return None
3 单元素列表返回该元素 parametrize test_single_element 覆盖
4 含负数、浮点数正确处理 test_negative_numbers + test_floats + test_mixed_int_float
5 附带单元测试每种至少 5 个 7 个通用 test case × 3 算法 = 21 个 + 一致性测试
6 代码放在 src/algorithms/
7 三种算法结果一致性测试 TestConsistency 8 组输入 + 空列表一致性 + 不修改原列表测试

代码审查

find_max_bubble.py

  • O(n²) 冒泡排序后取 arr[-1]
  • list(nums) 复制不修改原列表

find_max_linear.py

  • 重命名自 find_max.py,函数名改为 find_max_linear
  • 保留 find_max = find_max_linear 别名,向后兼容(test_find_max.py import 不 break)

find_max_quickselect.py

  • Lomuto partition 思路,递归找最大值
  • random pivot 避免最坏情况
  • 手动验证边界 case(两元素、全相同)正确
  • ⚠️ 递归深度:最坏情况 O(n),Python 默认递归上限 1000。对于 >1000 元素的列表理论上有栈溢出风险。但演示任务场景下可接受。

test_find_max_three.py

  • parametrize 对同一组输入跑三种算法断言相等——正是我在 Issue #117 讨论中建议的方式
  • TestConsistency.test_does_not_mutate_input 验证不修改原列表——重要的副作用检查
  • 边界 case 覆盖完整:空列表、单元素、负数、浮点数、重复值、混合类型

一致性检查

  • find_max.py 重命名为 find_max_linear.py,test_find_max.py 同步更新 import
  • find_max = find_max_linear 别名保持向后兼容
  • from __future__ import annotations 确保 Python 3.9 兼容

交付检查

  • 文档:无需更新(演示任务,无设计文档)
  • 测试:已包含 21 个通用 + 10 个一致性 test case

小问题

G1. find_max_quickselect 递归深度:对于 >1000 元素的列表理论上有栈溢出风险。建议在 docstring 中标注「递归实现,不建议用于 >1000 元素列表」。演示任务不影响。
G2. find_max_linear.py 的兼容别名 find_max = find_max_linear——后续如果有人直接 import find_max 会拿到 linear 版本。确认这是设计意图(向后兼容 PR #109)。

Approve

## 审查结论:Approve **风险级别:低**(5 文件 +127/-3 行,演示任务) --- ### 验收标准逐项确认(Issue #117) | # | 验收标准 | 结果 | |---|---------|------| | 1 | 三个函数签名 | ✅ find_max_bubble / find_max_quickselect / find_max_linear,签名一致 | | 2 | 空列表返回 None | ✅ 三种算法都有 `if not nums: return None` | | 3 | 单元素列表返回该元素 | ✅ parametrize test_single_element 覆盖 | | 4 | 含负数、浮点数正确处理 | ✅ test_negative_numbers + test_floats + test_mixed_int_float | | 5 | 附带单元测试每种至少 5 个 | ✅ 7 个通用 test case × 3 算法 = 21 个 + 一致性测试 | | 6 | 代码放在 src/algorithms/ | ✅ | | 7 | 三种算法结果一致性测试 | ✅ TestConsistency 8 组输入 + 空列表一致性 + 不修改原列表测试 | ### 代码审查 **find_max_bubble.py** ✅ - O(n²) 冒泡排序后取 arr[-1] - `list(nums)` 复制不修改原列表 **find_max_linear.py** ✅ - 重命名自 find_max.py,函数名改为 find_max_linear - 保留 `find_max = find_max_linear` 别名,向后兼容(test_find_max.py import 不 break) **find_max_quickselect.py** ✅ - Lomuto partition 思路,递归找最大值 - random pivot 避免最坏情况 - 手动验证边界 case(两元素、全相同)正确 - ⚠️ 递归深度:最坏情况 O(n),Python 默认递归上限 1000。对于 >1000 元素的列表理论上有栈溢出风险。但演示任务场景下可接受。 **test_find_max_three.py** ✅ - parametrize 对同一组输入跑三种算法断言相等——正是我在 Issue #117 讨论中建议的方式 - TestConsistency.test_does_not_mutate_input 验证不修改原列表——重要的副作用检查 - 边界 case 覆盖完整:空列表、单元素、负数、浮点数、重复值、混合类型 ### 一致性检查 - [x] find_max.py 重命名为 find_max_linear.py,test_find_max.py 同步更新 import ✅ - [x] `find_max = find_max_linear` 别名保持向后兼容 ✅ - [x] `from __future__ import annotations` 确保 Python 3.9 兼容 ✅ ### 交付检查 - 文档:无需更新(演示任务,无设计文档) - 测试:已包含 21 个通用 + 10 个一致性 test case ✅ ### 小问题 G1. find_max_quickselect 递归深度:对于 >1000 元素的列表理论上有栈溢出风险。建议在 docstring 中标注「递归实现,不建议用于 >1000 元素列表」。演示任务不影响。 G2. find_max_linear.py 的兼容别名 `find_max = find_max_linear`——后续如果有人直接 import find_max 会拿到 linear 版本。确认这是设计意图(向后兼容 PR #109)。 Approve

[CI] 失败

分支: 118
触发 commit: ac8444bb41ad5ad836f293199ad50dfebe816620
失败 Job: test
请检查 CI 日志并修复。

[CI] 失败 分支: 118 触发 commit: `ac8444bb41ad5ad836f293199ad50dfebe816620` 失败 Job: test 请检查 CI 日志并修复。
pangtong-fujunshi added 1 commit 2026-06-21 22:30:56 +00:00
[moz] fix(test): 补修 test_e2e_v31/test_four_phase 的 sys.path 污染
CI / lint (pull_request) Successful in 21s
CI / test (pull_request) Successful in 41s
CI / frontend (pull_request) Successful in 14s
CI / notify-on-failure (pull_request) Successful in 0s
a402bb2a2d
PR #110 遗漏的两个文件,同样在模块级执行 sys.path.insert(DEPLOY_DIR)
导致 CI 中 src 模块从安装目录加载。统一加 allow_module_level skip guard。

- tests/e2e/test_e2e_v31.py
- tests/e2e/test_four_phase.py
zhangfei-dev merged commit cbb58c3092 into main 2026-06-21 22:34:05 +00:00
zhangfei-dev deleted branch feat/117-三种排序算法找最大值 2026-06-21 22:34:06 +00:00
Sign in to join this conversation.