- 奇偶排序
- 归并排序
- 希尔排序
- 基数排序
- 统计排序
奇偶排序
先对奇数位进行排序,再对偶数位进行排序, 直到 奇数位,偶数位都不需要排序(不需要交换)
1package main
2
3import "fmt"
4
5// 9 2 1 6 0 7
6// 2 9 1 6 0 7 所有奇数位与身后的相邻的偶数位比较交换
7// 2 1 9 0 6 7所有偶数位与身后的相邻的奇数位比较交换
8//1 2 09 6 7 所有奇数位与身后的相邻的偶数位比较交换
9//1 0 2 6 9 7 所有偶数位与身后的相邻的奇数位比较交换
10//0 1 2 6 7 9 所有奇数位与身后的相邻的偶数位比较交换
11
12func OddEven(arr []int) []int {
13
14 isSorted := false //奇数位,偶数位都不需要排序的有序
15
16 for isSorted == false {
17 isSorted = true
18 for i := 1; i < len(arr)-1; i = i + 2 { //奇数位
19 if arr[i] > arr[i+1] { //需要交换换
20 arr[i], arr[i+1] = arr[i+1], arr[i]
21 isSorted = false
22 }
23 }
24 fmt.Println("1", arr)
25 for i := 0; i < len(arr)-1; i = i + 2 { //偶数位
26 if arr[i] > arr[i+1] { //需要交换换
27 arr[i], arr[i+1] = arr[i+1], arr[i]
28 isSorted = false
29 }
30 }
31 fmt.Println("0", arr)
32 }
33 return arr
34
35}
36
37func main() {
38 arr := []int{1, 9, 2, 8, 3, 7, 4, 6, 5, 10}
39 fmt.Println(OddEven(arr))
40}
归并排序
把排序数组分成多端,再合并
1package main
2
3import "fmt"
4
5//把元素分成2端分别排序 在合并
6//1,9,2,8,3, 7,4,6,5,10
7
8//1 2 3 8 9 // 456 7 10
9//12345678910
10func merge(leftarr []int, rightarr []int) []int {
11 leftindex := 0 //左边索引
12 rightindex := 0 //右边索引
13 lastarr := []int{} //最终的数组
14 for leftindex < len(leftarr) && rightindex < len(rightarr) {
15 if leftarr[leftindex] < rightarr[rightindex] {
16 lastarr = append(lastarr, leftarr[leftindex])
17 leftindex++
18
19 } else if leftarr[leftindex] > rightarr[rightindex] {
20 lastarr = append(lastarr, rightarr[rightindex])
21 rightindex++
22 } else {
23 lastarr = append(lastarr, rightarr[rightindex])
24 lastarr = append(lastarr, leftarr[leftindex])
25 leftindex++
26 rightindex++
27 }
28 }
29 for leftindex < len(leftarr) { //把没有结束的归并过来
30 lastarr = append(lastarr, leftarr[leftindex])
31 leftindex++
32 }
33 for rightindex < len(rightarr) { //把没有结束的归并过来
34 lastarr = append(lastarr, rightarr[rightindex])
35 rightindex++
36 }
37 return lastarr
38}
39
40func MergeSort(arr []int) []int {
41 length := len(arr)
42 if length <= 1 {
43 return arr
44 } else if length > 1 && length < 5 { //小于5个元素改用插入排序
45 return InsertSortX(arr)
46 } else {
47 mid := length / 2
48 leftarr := MergeSort(arr[:mid])
49 rightarr := MergeSort(arr[mid:])
50
51 return merge(leftarr, rightarr)
52 }
53}
54
55func InsertSortX(arr []int) []int {
56 length := len(arr) //数组长度
57 if length <= 1 {
58 return arr //一个元素的数组,直接返回
59 } else {
60 for i := 1; i < length; i++ { //跳过第一个
61 backup := arr[i] //备份插入的数据
62 j := i - 1 //上一个位置循环找到位置插入
63 for j >= 0 && backup < arr[j] {
64 arr[j+1] = arr[j] //从前往后移动
65 j--
66 }
67 arr[j+1] = backup //插入
68 //fmt.Println(arr)
69 }
70 return arr
71 }
72}
73
74func main() {
75 arr := []int{1, 9, 2, 8, 3, 7, 4, 6, 5, 10}
76 fmt.Println(MergeSort(arr))
77}
希尔排序
根据步长 一一交换数据,减少步长,直到步长为1。交换后 就是排序好后的数组
下面 先步长5 , 然后步长
1package main
2
3import "fmt"
4
5//1 9 2 8 3 7 4 6 5 10
6//1 7
7// 9 4
8// 2 6
9// 8 5
10// 3 10
11//1 4 2 5 3 7 9 6 8 10
12//1 3 8
13// 4 7 10
14// 2 9
15// 5 6
16//1 4 2 5 3 7 9 6 8 10
17//1 5 9 10
18// 3 4 6
19// 2 7 8
20//1 3 2 5 4 7 9 6 8 10
21//1 2 4 8 9
22// 3 5 6 7 10
23//1 3 2 5 4 6 8 7 9 10
24
25func ShellSortStep(arr []int, start int, gap int) {
26 length := len(arr) //数组长度
27 for i := start + gap; i < length; i += gap { //插入排序的变种
28 backup := arr[i] //备份插入的数据
29 j := i - gap //上一个位置循环找到位置插入
30 for j >= 0 && backup < arr[j] {
31 arr[j+gap] = arr[j] //从前往后移动
32 j -= gap
33 }
34 arr[j+gap] = backup //插入
35 fmt.Println(arr)
36
37 }
38
39}
40
41func ShellSort(arr []int) []int {
42 length := len(arr) //数组长度
43 if length <= 1 {
44 return arr //一个元素的数组,直接返回
45 } else {
46 gap := length / 2
47 for gap > 0 {
48 for i := 0; i < gap; i++ { //处理每个元素的步长
49 ShellSortStep(arr, i, gap)
50 }
51 //gap--
52 gap /= 2
53 }
54
55 }
56
57 return arr
58}
59
60func main() {
61 arr := []int{1, 9, 2, 8, 3, 7, 4, 6, 5, 10}
62 fmt.Println(ShellSort(arr))
63
64}
基数排序
1package main
2
3import "fmt"
4
5
6func SelectSortMaxx(arr []int) int {
7 length := len(arr) //数组长度
8 if length <= 1 {
9 return arr[0] //一个元素的数组,直接返回
10 } else {
11 max := arr[0] //假定第一个最大
12 for i := 1; i < length; i++ {
13 if arr[i] > max { //任何一个比我的大的数,最大的
14 max = arr[i]
15 }
16 }
17 return max
18 }
19}
20
21func RadixSort(arr []int) []int {
22 max := SelectSortMaxx(arr) //寻找数组极大值 99991
23 for bit := 1; max/bit > 0; bit *= 10 {
24 //按照数量级分段
25 arr = BitSort(arr, bit) //每次处理一个级别的排序
26 }
27 return arr
28}
29func BitSort(arr []int, bit int) []int {
30 length := len(arr) //数组长度
31 bitcounts := make([]int, 10) //统计长度0,1,2,3,4,5,6,7,8,9
32 for i := 0; i < length; i++ {
33 num := (arr[i] / bit) % 10 //分层处理,bit=1000的,三位数不参与排序了,bit=10000的四位数不参与排序
34 bitcounts[num]++ //统计余数相等个数
35 }
36
37 // 11, 91, 222, 878, 348, 7123, 4213, 6232, 5123, 111011
38 //fmt.Println(bitcounts)
39
40 // 0 1 2 3 4 5
41 // 1 0 3 0 0 1
42 // 1 1 4 4 4 5
43 for i := 1; i < 10; i++ {
44 bitcounts[i] += bitcounts[i-1] //叠加,计算位置
45 }
46 //fmt.Println(bitcounts)
47
48 tmp := make([]int, 10) //开辟临时数组
49 for i := length - 1; i >= 0; i-- {
50 num := (arr[i] / bit) % 10
51 tmp[bitcounts[num]-1] = arr[i] //计算排序的位置
52 bitcounts[num]--
53 }
54 //fmt.Println("---", tmp)
55 //91, 222, 878, 348, 7123, 4213, 6232, 5123, 111011,10
56
57 for i := 0; i < length; i++ {
58 arr[i] = tmp[i] //保存数组
59 }
60 fmt.Println(arr)
61 return arr
62
63}
64
65func main() {
66 arr := []int{91, 222, 878, 348, 9, 7123, 4213, 6232, 5123, 11}
67 fmt.Println(RadixSort(arr))
68
69}
统计排序
1package main
2
3import "fmt"
4
5func SelectSortMaxy(arr []int) int {
6 length := len(arr) //数组长度
7 if length <= 1 {
8 return arr[0] //一个元素的数组,直接返回
9 } else {
10 max := arr[0] //假定第一个最大
11 for i := 1; i < length; i++ {
12 if arr[i] > max { //任何一个比我的大的数,最大的
13 max = arr[i]
14 }
15 }
16 return max
17 }
18
19}
20func Countsort(arr []int) []int {
21 max := SelectSortMaxy(arr) //寻找最大值
22
23 sortedarr := make([]int, len(arr)) //排序之后存储
24
25 countsarr := make([]int, len(arr)) //统计次数
26
27 for _, v := range arr {
28 countsarr[v]++
29 }
30 fmt.Println("第一次统计次数", countsarr) //统计次数
31
32 for i := 1; i <= max; i++ {
33 countsarr[i] += countsarr[i-1] //叠加
34 }
35 fmt.Println("次数叠加", countsarr) //统计次数
36
37 for _, v := range arr {
38 // 值就越大 下标越大
39 sortedarr[countsarr[v]-1] = v //展开数据
40 countsarr[v]-- //递减
41
42 fmt.Println("zkcount", countsarr)
43 fmt.Println("zk", sortedarr)
44 }
45 return sortedarr
46
47}
48
49//1 2 3 4 5
50//2 3 2 2 1
51
52//2 5 7 9 10
53
54// 1 2 3 4 5
55// 11 222 33 44 15
56//11 222 33 44 5
57
58func main() {
59 arr := []int{0, 2, 3, 4, 4, 3, 2, 1, 2, 5, 5, 3, 4, 3, 2, 1}
60 fmt.Println(Countsort(arr))
61
62}