Skip to content

Commit d331c55

Browse files
Merge pull request wangzheng0822#81 from ScissorsFeet/master
12_sorts
2 parents e4b5af8 + 09b6461 commit d331c55

File tree

6 files changed

+158
-0
lines changed

6 files changed

+158
-0
lines changed

go/12_sorts/MergeSort.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
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: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
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: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
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: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
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+
}

go/14_sorts/CountingSort.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package _4_sorts
2+
3+
import "math"
4+
5+
func CountingSort(a []int, n int) {
6+
if n <= 1 {
7+
return
8+
}
9+
10+
var max int = math.MinInt32
11+
for i := range a {
12+
if a[i] > max {
13+
max = a[i]
14+
}
15+
}
16+
17+
c := make([]int, max+1)
18+
for i := range a {
19+
c[a[i]]++
20+
}
21+
for i := 1; i <= max; i++ {
22+
c[i] += c[i-1]
23+
}
24+
25+
r := make([]int, n)
26+
for i := range a {
27+
index := c[a[i]] - 1
28+
r[index] = a[i]
29+
c[a[i]]--
30+
}
31+
32+
copy(a, r)
33+
}

go/14_sorts/CountingSort_test.go

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

0 commit comments

Comments
 (0)