已开启
分治法实现归并排序-湖北工业大学-殷渝-徐承志 #149
、创建于 2025年6月24日
分治法实现归并排序-湖北工业大学-殷渝-徐承志 #149
已开启
共 3 个文件变更+87-7
| @@ -0,0 +1,56 @@ | |||
| 1 | +// 分治法实现归并排序 | ||
| 2 | +func mergeSort(arr: [Int64]): [Int64] { | ||
| 3 | + // 递归终止条件:单个元素直接返回 | ||
| 4 | + if arr.size <= 1 { | ||
| 5 | + return arr | ||
| 6 | + } | ||
| 7 | + | ||
| 8 | + // 分解步骤:二分数组 | ||
| 9 | + let mid = arr.size / 2 | ||
| 10 | + let left = arr[0:mid] // 左子数组切片 | ||
| 11 | + let right = arr[mid:] // 右子数组切片 | ||
| 12 | + | ||
| 13 | + // 递归求解子问题 | ||
| 14 | + let sortedLeft = mergeSort(left) | ||
| 15 | + let sortedRight = mergeSort(right) | ||
| 16 | + | ||
| 17 | + // 合并步骤:合并有序数组 | ||
| 18 | + return merge(sortedLeft, sortedRight) | ||
| 19 | +} | ||
| 20 | + | ||
| 21 | +// 合并两个有序数组 | ||
| 22 | +func merge(left: [Int64], right: [Int64]): [Int64] { | ||
| 23 | + var result: [Int64] = [] | ||
| 24 | + var i = 0, j = 0 | ||
| 25 | + | ||
| 26 | + // 双指针遍历有序数组合并 | ||
| 27 | + while i < left.size && j < right.size { | ||
| 28 | + if left[i] < right[j] { | ||
| 29 | + result.append(left[i]) | ||
| 30 | + i += 1 | ||
| 31 | + } else { | ||
| 32 | + result.append(right[j]) | ||
| 33 | + j += 1 | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + // 添加剩余元素 | ||
| 38 | + while i < left.size { | ||
| 39 | + result.append(left[i]) | ||
| 40 | + i += 1 | ||
| 41 | + } | ||
| 42 | + while j < right.size { | ||
| 43 | + result.append(right[j]) | ||
| 44 | + j += 1 | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + return result | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +// 主函数 | ||
| 51 | +main() { | ||
| 52 | + let data = [38, 27, 43, 3, 9, 82, 10] | ||
| 53 | + let sorted = mergeSort(data) | ||
| 54 | + println("排序结果: ${sorted}") | ||
| 55 | + // 输出: [3, 9, 10, 27, 38, 43, 82] | ||
| 56 | +} | ||
| @@ -0,0 +1,31 @@ | |||
| 1 | +算法框架 | ||
| 2 | + | ||
| 3 | +递归终止条件:数组长度 ≤ 1 时直接返回 | ||
| 4 | +分解: | ||
| 5 | +mid=⌊n/2⌋ | ||
| 6 | + | ||
| 7 | +,数组拆分为左右子区间 | ||
| 8 | +治理:递归调用 mergeSort 处理子问题 | ||
| 9 | +合并:merge() 函数实现有序数组的线性合并 | ||
| 10 | +时间复杂度分析 | ||
| 11 | + | ||
| 12 | +分解复杂度: | ||
| 13 | +O(1) | ||
| 14 | + | ||
| 15 | +(切片操作) | ||
| 16 | +子问题数量:每次递归产生 2 个子问题(二叉树) | ||
| 17 | +合并复杂度: | ||
| 18 | + | ||
| 19 | +O(n) | ||
| 20 | + | ||
| 21 | +(单次合并操作) | ||
| 22 | +总时间复杂度: | ||
| 23 | + | ||
| 24 | +T(n)=2T(n/2)+O(n)=O(nlogn) | ||
| 25 | + | ||
| 26 | +仓颉语言特性应用 | ||
| 27 | + | ||
| 28 | +切片操作:arr[0:mid] 语法实现高效数组分割 | ||
| 29 | +类型安全:[Int64] 显式声明数组类型 | ||
| 30 | +递归优化:编译器自动优化尾递归调用1 | ||
| 31 | +泛型支持:可修改为 <T: Comparable> 实现泛型排序 | ||
| @@ -1,7 +0,0 @@ | |||
| 1 | -# Exercises | ||
| 2 | - | ||
| 3 | -本仓收集仓颉算法题解程序。 | ||
| 4 | - | ||
| 5 | -提交要求: | ||
| 6 | - - 每道编程题放在不同的子目录下,目录以题目命名,优先使用中文。 | ||
| 7 | - - 在子目录下创建 `readme.md` 文件,其中填写题目描述,还可以包含解题指导等内容。 | ||