-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmerge-sort.go
59 lines (56 loc) · 1013 Bytes
/
merge-sort.go
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
53
54
55
56
57
58
59
package sort
// Time: O(nlogn)
// Space: O(n)
func MergeSort(arr []interface{}, comparator func(a interface{}, b interface{}) int) {
n := len(arr)
if n <= 1 {
return
}
step := 1
for step < n {
step *= 2
for i := 0; i < n; i += step {
start, end := i, i+step-1
mid := (start + end + 1) / 2
doMerge(arr, comparator, start, min(mid, n-1), min(end, n-1))
}
}
}
func doMerge(arr []interface{}, comparator func(a interface{}, b interface{}) int, start, mid, end int) {
i := start
j := mid
sorted := make([]interface{}, end-start+1)
k := 0
for i < mid && j <= end {
if comparator(arr[i], arr[j]) < 0 {
sorted[k] = arr[i]
i++
} else {
sorted[k] = arr[j]
j++
}
k++
}
// the rest of left
for ; i < mid; i++ {
sorted[k] = arr[i]
k++
}
// the rest of right
for ; j <= end; j++ {
sorted[k] = arr[j]
k++
}
// copy the sorted
k = 0
for z := start; z <= end; z++ {
arr[z] = sorted[k]
k++
}
}
func min(a, b int) int {
if a < b {
return a
}
return b
}