已开启
分治法实现归并排序-湖北工业大学-殷渝-徐承志 #149
创建于 2025年6月24日
分治法实现归并排序-湖北工业大学-殷渝-徐承志 #149
已开启
创建于 2025年6月24日
3 个文件变更+87-7
AHBUT/1.cj+56-0
@@ -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` 文件,其中填写题目描述,还可以包含解题指导等内容。