Skip to content

Commit fd6e993

Browse files
authored
Merge pull request krahets#175 from nuomi1/feature/time_complexity-Swift
feat: add Swift codes for time complexity article
2 parents 466fdd4 + 7e1ff8f commit fd6e993

File tree

4 files changed

+488
-0
lines changed

4 files changed

+488
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
/*
2+
* File: time_complexity.swift
3+
* Created Time: 2022-12-26
4+
* Author: nuomi1 ([email protected])
5+
*/
6+
7+
// 常数阶
8+
func constant(n: Int) -> Int {
9+
var count = 0
10+
let size = 100_000
11+
for _ in 0 ..< size {
12+
count += 1
13+
}
14+
return count
15+
}
16+
17+
// 线性阶
18+
func linear(n: Int) -> Int {
19+
var count = 0
20+
for _ in 0 ..< n {
21+
count += 1
22+
}
23+
return count
24+
}
25+
26+
// 线性阶(遍历数组)
27+
func arrayTraversal(nums: [Int]) -> Int {
28+
var count = 0
29+
// 循环次数与数组长度成正比
30+
for _ in nums {
31+
count += 1
32+
}
33+
return count
34+
}
35+
36+
// 平方阶
37+
func quadratic(n: Int) -> Int {
38+
var count = 0
39+
// 循环次数与数组长度成平方关系
40+
for _ in 0 ..< n {
41+
for _ in 0 ..< n {
42+
count += 1
43+
}
44+
}
45+
return count
46+
}
47+
48+
// 平方阶(冒泡排序)
49+
func bubbleSort(nums: inout [Int]) -> Int {
50+
var count = 0 // 计数器
51+
// 外循环:待排序元素数量为 n-1, n-2, ..., 1
52+
for i in sequence(first: nums.count - 1, next: { $0 > 0 ? $0 - 1 : nil }) {
53+
// 内循环:冒泡操作
54+
for j in 0 ..< i {
55+
if nums[j] > nums[j + 1] {
56+
// 交换 nums[j] 与 nums[j + 1]
57+
let tmp = nums[j]
58+
nums[j] = nums[j + 1]
59+
nums[j + 1] = tmp
60+
count += 3 // 元素交换包含 3 个单元操作
61+
}
62+
}
63+
}
64+
return count
65+
}
66+
67+
// 指数阶(循环实现)
68+
func exponential(n: Int) -> Int {
69+
var count = 0
70+
var base = 1
71+
// cell 每轮一分为二,形成数列 1, 2, 4, 8, ..., 2^(n-1)
72+
for _ in 0 ..< n {
73+
for _ in 0 ..< base {
74+
count += 1
75+
}
76+
base *= 2
77+
}
78+
// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
79+
return count
80+
}
81+
82+
// 指数阶(递归实现)
83+
func expRecur(n: Int) -> Int {
84+
if n == 1 {
85+
return 1
86+
}
87+
return expRecur(n: n - 1) + expRecur(n: n - 1) + 1
88+
}
89+
90+
// 对数阶(循环实现)
91+
func logarithmic(n: Int) -> Int {
92+
var count = 0
93+
var n = n
94+
while n > 1 {
95+
n = n / 2
96+
count += 1
97+
}
98+
return count
99+
}
100+
101+
// 对数阶(递归实现)
102+
func logRecur(n: Int) -> Int {
103+
if n <= 1 {
104+
return 0
105+
}
106+
return logRecur(n: n / 2) + 1
107+
}
108+
109+
// 线性对数阶
110+
func linearLogRecur(n: Double) -> Int {
111+
if n <= 1 {
112+
return 1
113+
}
114+
var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)
115+
for _ in 0 ..< Int(n) {
116+
count += 1
117+
}
118+
return count
119+
}
120+
121+
// 阶乘阶(递归实现)
122+
func factorialRecur(n: Int) -> Int {
123+
if n == 0 {
124+
return 1
125+
}
126+
var count = 0
127+
// 从 1 个分裂出 n 个
128+
for _ in 0 ..< n {
129+
count += factorialRecur(n: n - 1)
130+
}
131+
return count
132+
}
133+
134+
func main() {
135+
// 可以修改 n 运行,体会一下各种复杂度的操作数量变化趋势
136+
let n = 8
137+
print("输入数据大小 n =", n)
138+
139+
var count = constant(n: n)
140+
print("常数阶的计算操作数量 =", count)
141+
142+
count = linear(n: n)
143+
print("线性阶的计算操作数量 =", count)
144+
count = arrayTraversal(nums: Array(repeating: 0, count: n))
145+
print("线性阶(遍历数组)的计算操作数量 =", count)
146+
147+
count = quadratic(n: n)
148+
print("平方阶的计算操作数量 =", count)
149+
var nums = Array(sequence(first: n, next: { $0 > 0 ? $0 - 1 : nil })) // [n,n-1,...,2,1]
150+
count = bubbleSort(nums: &nums)
151+
print("平方阶(冒泡排序)的计算操作数量 =", count)
152+
153+
count = exponential(n: n)
154+
print("指数阶(循环实现)的计算操作数量 =", count)
155+
count = expRecur(n: n)
156+
print("指数阶(递归实现)的计算操作数量 =", count)
157+
158+
count = logarithmic(n: n)
159+
print("对数阶(循环实现)的计算操作数量 =", count)
160+
count = logRecur(n: n)
161+
print("对数阶(递归实现)的计算操作数量 =", count)
162+
163+
count = linearLogRecur(n: Double(n))
164+
print("线性对数阶(递归实现)的计算操作数量 =", count)
165+
166+
count = factorialRecur(n: n)
167+
print("阶乘阶(递归实现)的计算操作数量 =", count)
168+
}
169+
170+
main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* File: worst_best_time_complexity.swift
3+
* Created Time: 2022-12-26
4+
* Author: nuomi1 ([email protected])
5+
*/
6+
7+
// 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱
8+
func randomNumbers(n: Int) -> [Int] {
9+
// 生成数组 nums = { 1, 2, 3, ..., n }
10+
var nums = Array(1 ... n)
11+
// 随机打乱数组元素
12+
nums.shuffle()
13+
return nums
14+
}
15+
16+
// 查找数组 nums 中数字 1 所在索引
17+
func findOne(nums: [Int]) -> Int {
18+
for i in nums.indices {
19+
if nums[i] == 1 {
20+
return i
21+
}
22+
}
23+
return -1
24+
}
25+
26+
// Driver Code
27+
func main() {
28+
for _ in 0 ..< 10 {
29+
let n = 100
30+
let nums = randomNumbers(n: n)
31+
let index = findOne(nums: nums)
32+
print("数组 [ 1, 2, ..., n ] 被打乱后 =", nums)
33+
print("数字 1 的索引为", index)
34+
}
35+
}
36+
37+
main()

0 commit comments

Comments
 (0)