Skip to content

Commit ae15c54

Browse files
committed
add merge sort
1 parent d121211 commit ae15c54

File tree

4 files changed

+62
-5
lines changed

4 files changed

+62
-5
lines changed

docs/5.merge_sort.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,11 @@
55

66
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
77
* 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法);
8-
* 自下而上的迭代;
8+
* 自下而上的迭代;
9+
10+
## 算法步骤
11+
1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
12+
2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
13+
3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
14+
4. 重复步骤3直到某一指针达到序列尾;
15+
5. 将另一序列剩下的所有元素直接复制到合并序列列尾。

insertion_sort.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package algorithm
22

3-
import "fmt"
4-
53
// InsertionSort ..
64
// No.3
75
// 插入排序(稳定)算法步骤:
@@ -13,12 +11,12 @@ func InsertionSort(arr []int) []int {
1311
for i := range arr {
1412
preIndex := i - 1
1513
current := arr[i]
16-
fmt.Printf("current: %v\n", current)
14+
// fmt.Printf("current: %v\n", current)
1715
for preIndex >= 0 && arr[preIndex] > current {
1816
arr[preIndex+1] = arr[preIndex]
1917
preIndex--
2018
}
21-
fmt.Printf("finally i: %v, current: %v, preIndex: %v\n", i, current, preIndex)
19+
// fmt.Printf("finally i: %v, current: %v, preIndex: %v\n", i, current, preIndex)
2220
arr[preIndex+1] = current
2321
}
2422
return arr

merge_sort.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package algorithm
2+
3+
// MergeSort ..
4+
// No.5
5+
func mergeSort(arr []int) []int {
6+
length := len(arr)
7+
if length < 2 {
8+
return arr
9+
}
10+
middle := length / 2
11+
left := arr[0:middle]
12+
right := arr[middle:]
13+
return merge(mergeSort(left), mergeSort(right))
14+
}
15+
16+
func merge(left []int, right []int) []int {
17+
var result []int
18+
for len(left) != 0 && len(right) != 0 {
19+
if left[0] < right[0] {
20+
result = append(result, left[0])
21+
left = left[1:]
22+
} else {
23+
result = append(result, right[0])
24+
right = right[1:]
25+
}
26+
}
27+
for len(left) != 0 {
28+
result = append(result, left[0])
29+
left = left[1:]
30+
}
31+
for len(right) != 0 {
32+
result = append(result, right[0])
33+
right = right[1:]
34+
}
35+
return result
36+
}

merge_sort_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package algorithm
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestMergeSort(t *testing.T) {
11+
arr := []int{3, 2, 0, 5, 10, 1}
12+
arrSort := mergeSort(arr)
13+
fmt.Printf("arr after sored: %v\n", arrSort)
14+
assert.Equal(t, 10, arrSort[5])
15+
assert.Equal(t, 5, arrSort[4])
16+
}

0 commit comments

Comments
 (0)