-
Notifications
You must be signed in to change notification settings - Fork 0
/
t9-count-sort.md
52 lines (40 loc) · 1.53 KB
/
t9-count-sort.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 计数排序
计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
![754476-b927ae5439d0ed31](http://blog.oldbird.run/2019-09-02-754476-b927ae5439d0ed31.gif)
是一种 O(n)的排序算法,其思路是开一个长度为 maxValue-minValue+1 的数组,然后
**分配**。扫描一遍原始数组,以当前值- minValue 作为下标,将该下标的计数器增 1。
**收集**。扫描一遍计数器数组,按顺序把值收集起来。
## 代码实现
```swift
enum CountingSortError: Error {
case arrayEmpty
}
func countingSort(array: [Int]) throws -> [Int] {
guard array.count > 0 else {
throw CountingSortError.arrayEmpty
}
// Step 1
// 获取最大元素
let maxElement = array.max() ?? 0
// 创建一个 maxElement + 1 的数组,并且统计
var countArray = [Int](repeating: 0, count: Int(maxElement + 1))
for element in array {
countArray[element] += 1
}
// Step 2
// 确定在每个元素之前放置的元素的数量,这一步很经典
for index in 1 ..< countArray.count {
let sum = countArray[index] + countArray[index - 1]
countArray[index] = sum
}
// Step 3
// 输出
var sortedArray = [Int](repeating: 0, count: array.count)
for element in array {
countArray[element] -= 1
sortedArray[countArray[element]] = element
}
return sortedArray
}
try countingSort(array: [10, 9, 8, 7, 1, 2, 7, 3])
```