Skip to content

Commit 58e8ec4

Browse files
author
leotyliu(刘天一)
committed
12_sort
1 parent f4d5187 commit 58e8ec4

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed

go/12_sorts/MergeSort.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,48 @@
11
package _2_sorts
2+
3+
func MergeSort(arr []int) {
4+
arrLen := len(arr)
5+
if arrLen <= 1 {
6+
return
7+
}
8+
9+
mergeSort(arr, 0, arrLen-1)
10+
}
11+
12+
func mergeSort(arr []int, start, end int) {
13+
if start >= end {
14+
return
15+
}
16+
17+
mid := (start + end) / 2
18+
mergeSort(arr, start, mid)
19+
mergeSort(arr, mid+1, end)
20+
merge(arr, start, mid, end)
21+
}
22+
23+
func merge(arr []int, start, mid, end int) {
24+
tmpArr := make([]int, end-start+1)
25+
26+
i := start
27+
j := mid + 1
28+
k := 0
29+
for ; i <= mid && j <= end; k++ {
30+
if arr[i] < arr[j] {
31+
tmpArr[k] = arr[i]
32+
i++
33+
} else {
34+
tmpArr[k] = arr[j]
35+
j++
36+
}
37+
}
38+
39+
for ; i <= mid; i++ {
40+
tmpArr[k] = arr[i]
41+
k++
42+
}
43+
for ; j <= end; j++ {
44+
tmpArr[k] = arr[j]
45+
k++
46+
}
47+
copy(arr[start:end+1], tmpArr)
48+
}

go/12_sorts/MergeSort_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,13 @@
11
package _2_sorts
2+
3+
import "testing"
4+
5+
func TestMergeSort(t *testing.T) {
6+
arr := []int{5, 4}
7+
MergeSort(arr)
8+
t.Log(arr)
9+
10+
arr = []int{5, 4, 3, 2, 1}
11+
MergeSort(arr)
12+
t.Log(arr)
13+
}

go/12_sorts/QuickSort.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,38 @@
11
package _2_sorts
2+
3+
func QuickSort(arr []int) {
4+
arrLen := len(arr)
5+
if arrLen <= 1 {
6+
return
7+
}
8+
quickSort(arr, 0, arrLen-1)
9+
}
10+
11+
func quickSort(arr []int, start, end int) {
12+
if start >= end {
13+
return
14+
}
15+
16+
pivot := partition(arr, start, end)
17+
quickSort(arr, start, pivot)
18+
quickSort(arr, pivot+1, end)
19+
}
20+
21+
func partition(arr []int, low, high int) int {
22+
pivotV := arr[low]
23+
for low < high {
24+
for low < high && arr[high] > pivotV { //指针从右边开始向右找到一个比pivot小的数
25+
high--
26+
}
27+
arr[low] = arr[high] //将这个数放到low位,注意第一次这个位置放的是pivot值,所以不会丢
28+
29+
for low < high && arr[low] < pivotV { //指针从左边开始向右找到第一个比pivot大的数
30+
low++
31+
}
32+
arr[high] = arr[low] //将这个数赋值给之前的high指针,因为之前high指针指向的数已经被一定,所以不会丢
33+
}
34+
35+
//最后将pivot的值放入合适位置,此时low与high相等
36+
arr[low] = pivotV
37+
return low
38+
}

go/12_sorts/QuickSort_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,13 @@
11
package _2_sorts
2+
3+
import "testing"
4+
5+
func TestQuickSort(t *testing.T) {
6+
arr := []int{5, 4}
7+
QuickSort(arr)
8+
t.Log(arr)
9+
10+
arr = []int{5, 4, 3, 2, 1}
11+
QuickSort(arr)
12+
t.Log(arr)
13+
}

0 commit comments

Comments
 (0)