File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ package sort
2+
3+ //冒泡排序,a是数组,n表示数组大小
4+ func BubbleSort (a []int , n int ) {
5+ if n <= 1 {
6+ return
7+ }
8+ for i := 0 ; i < n ; i ++ {
9+ // 提前退出标志
10+ flag := false
11+ for j := 0 ; j < n - i - 1 ; j ++ {
12+ if a [j ] > a [j + 1 ] {
13+ a [j ], a [j + 1 ] = a [j + 1 ], a [j ]
14+ //此次冒泡有数据交换
15+ flag = true
16+ }
17+ }
18+ // 如果没有交换数据,提前退出
19+ if ! flag {
20+ break
21+ }
22+ }
23+ }
Original file line number Diff line number Diff line change 1+ package sort
2+
3+ import (
4+ "fmt"
5+ )
6+
7+ // 桶排序
8+
9+ // 获取待排序数组中的最大值
10+ func getMax (a []int ) int {
11+ max := a [0 ]
12+ for i := 1 ; i < len (a ); i ++ {
13+ if a [i ] > max {
14+ max = a [i ]
15+ }
16+ }
17+ return max
18+ }
19+
20+ func BucketSort (a []int ) {
21+ num := len (a )
22+ if num <= 1 {
23+ return
24+ }
25+ max := getMax (a )
26+ buckets := make ([][]int , num ) // 二维切片
27+
28+ index := 0
29+ for i := 0 ; i < num ; i ++ {
30+ index = a [i ] * (num - 1 ) / max // 桶序号
31+ buckets [index ] = append (buckets [index ], a [i ]) // 加入对应的桶中
32+ }
33+
34+ tmpPos := 0 // 标记数组位置
35+ for i := 0 ; i < num ; i ++ {
36+ bucketLen := len (buckets [i ])
37+ if bucketLen > 0 {
38+ QuickSort (buckets [i ]) // 桶内做快速排序
39+ copy (a [tmpPos :], buckets [i ])
40+ tmpPos += bucketLen
41+ }
42+ }
43+
44+ }
45+
46+ // 桶排序简单实现
47+ func BucketSortSimple (source []int ) {
48+ if len (source ) <= 1 {
49+ return
50+ }
51+ array := make ([]int , getMax (source )+ 1 )
52+ for i := 0 ; i < len (source ); i ++ {
53+ array [source [i ]] ++
54+ }
55+ fmt .Println (array )
56+ c := make ([]int , 0 )
57+ for i := 0 ; i < len (array ); i ++ {
58+ for array [i ] != 0 {
59+ c = append (c , i )
60+ array [i ] --
61+ }
62+ }
63+ copy (source , c )
64+
65+ }
Original file line number Diff line number Diff line change 1+ package sort
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+ }
Original file line number Diff line number Diff line change 1+ package sort
2+
3+ // 插入排序,a表示数组,n表示数组大小
4+ func InsertionSort (a []int , n int ) {
5+ if n <= 1 {
6+ return
7+ }
8+ for i := 1 ; i < n ; i ++ {
9+ value := a [i ]
10+ j := i - 1
11+ //查找要插入的位置并移动数据
12+ for ; j >= 0 ; j -- {
13+ if a [j ] > value {
14+ a [j + 1 ] = a [j ]
15+ } else {
16+ break
17+ }
18+ }
19+ a [j + 1 ] = value
20+ }
21+ }
Original file line number Diff line number Diff line change 1+ package sort
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+ }
Original file line number Diff line number Diff line change 1+ package sort
2+
3+ // QuickSort is quicksort methods for golang
4+ func QuickSort (arr []int ) {
5+ separateSort (arr , 0 , len (arr )- 1 )
6+ }
7+
8+ func separateSort (arr []int , start , end int ) {
9+ if start >= end {
10+ return
11+ }
12+ i := partition (arr , start , end )
13+ separateSort (arr , start , i - 1 )
14+ separateSort (arr , i + 1 , end )
15+ }
16+
17+ func partition (arr []int , start , end int ) int {
18+ // 选取最后一位当对比数字
19+ pivot := arr [end ]
20+
21+ var i = start
22+ for j := start ; j < end ; j ++ {
23+ if arr [j ] < pivot {
24+ if ! (i == j ) {
25+ // 交换位置
26+ arr [i ], arr [j ] = arr [j ], arr [i ]
27+ }
28+ i ++
29+ }
30+ }
31+
32+ arr [i ], arr [end ] = arr [end ], arr [i ]
33+
34+ return i
35+ }
Original file line number Diff line number Diff line change 1+ package sort
2+
3+ // 选择排序,a表示数组,n表示数组大小
4+ func SelectionSort (a []int , n int ) {
5+ if n <= 1 {
6+ return
7+ }
8+ for i := 0 ; i < n ; i ++ {
9+ // 查找最小值
10+ minIndex := i
11+ for j := i + 1 ; j < n ; j ++ {
12+ if a [j ] < a [minIndex ] {
13+ minIndex = j
14+ }
15+ }
16+ // 交换
17+ a [i ], a [minIndex ] = a [minIndex ], a [i ]
18+
19+ }
20+ }
You can’t perform that action at this time.
0 commit comments