- 选择排序
- 冒泡排序
- 插入排序
- 堆排序
- 快速排序
选择排序
从下标0开始到length-1 , 每次选出一个最大或最小值, 交换 ,和冒泡排序不同,冒泡时交换频率很高
1package main
2import "fmt"
3func selectSort(sortNumArr []int) []int {
4 len := len(sortNumArr)
5 for i := 0; i < len-1; i++ { //只剩一个元素不需要挑选,
6 max := i //标记索引
7 for j := i + 1; j < len; j++ { //每次选出一个极大值
8 if sortNumArr[max] < sortNumArr[j] {
9 max = j // 标记极大值大索引
10 }
11 }
12 sortNumArr[i], sortNumArr[max] = sortNumArr[max], sortNumArr[i]
13 }
14 return sortNumArr
15}
16func main() {
17 var intNumArr = []int{8}
18 res := selectSort(intNumArr)
19 fmt.Println(res)
20}
字符串比较大小
1strings.Compare("string1","string2")
冒泡排序
1package main
2
3import "fmt"
4
5//11,9,2,8,3,7,4,6,5,10
6//9 11 2 8 3 7 4 6 5 10
7//9 2 11 8 3 7 4 6 5 10
8//9 2 8 11 3 7 4 6 5 10
9//9 2 8 3 11 7 4 6 5 10
10//9 2 8 3 7 11 4 6 5 10
11//9 2 8 3 7 4 11 6 5 10
12//9 2 8 3 7 4 6 11 5 10
13//9 2 8 3 7 4 6 5 11 10
14//9 2 8 3 7 4 6 5 10 11
15//9 2 8 3 7 4 6 5 10
16
17func BubbleFindMax(arr []int) int {
18 length := len(arr) //求数组长度
19 if length <= 1 {
20 return arr[0]
21 } else {
22 for i := 0; i < length-1; i++ {
23 if arr[i] > arr[i+1] { //两两比较
24 arr[i], arr[i+1] = arr[i+1], arr[i]
25 }
26 }
27 return arr[length-1]
28 }
29}
30
31func Bubblesort(arr []int) []int {
32 length := len(arr) //求数组长度
33 if length <= 1 {
34 return arr
35 } else {
36 for i := 0; i < length-1; i++ { //只剩一个,不需要冒泡了
37 isneedexchange := false //优化, 如果出现不用交换的场景,表示已经有序
38 for j := 0; j < length-1-i; j++ {
39 if arr[j] > arr[j+1] { //两两比较
40 arr[j], arr[j+1] = arr[j+1], arr[j]
41 isneedexchange = true
42 }
43 }
44 if !isneedexchange {
45 break
46 }
47 fmt.Println(arr)
48
49 }
50
51 return arr
52 }
53}
54
55func main05() {
56 arr := []int{11, 9, 2, 8, 3, 7, 4, 6, 5, 10}
57 //fmt.Println(BubbleFindMax(arr))
58 fmt.Println(Bubblesort(arr))
59
60}
插入排序
找到位置比自己小(大)的插入进去。
1package main
2
3import "fmt"
4
5func InsertTest(arr []int) []int {
6 //假定处理下标3的, 从下标2开始找,找到比 下标3的值小的位置插入进去,
7 num := arr[3]
8 j := 3 - 1
9 for ; j >= 0 && arr[j] > num; j-- {
10 arr[j+1] = arr[j]
11 }
12 arr[j+1] = num
13 return arr
14}
15
16func InsertSort(arr []int) []int {
17 for i := 1; i < len(arr); i++ {
18 num := arr[i]
19 j := i - 1
20 for ; j >= 0 && arr[j] > num; j-- {
21 arr[j+1] = arr[j]
22 }
23 arr[j+1] = num
24 }
25 return arr
26
27}
28
29func main() {
30 var arr = []int{1, 2, 9, 8, 0, 3, 7, 4, 5, 6}
31 fmt.Println(InsertTest(arr)) //[1 2 8 9 0 3 7 4 5 6]
32 fmt.Println(InsertSort(arr))
33}
堆排序
n代表数组长度
树的数量 <= n/2
1package main
2
3import "fmt"
4
5func HeapSort(arr[] int) []int{
6 length:=len(arr)
7 for i:=0;i<length;i++{
8 lastmesslen:=length-i //每次截取一段
9 HeapSortMax(arr,lastmesslen) //arr[0] 就是最大的
10 fmt.Println(arr)
11 if i<length{
12 arr[0],arr[lastmesslen-1]=arr[lastmesslen-1],arr[0] //把最大的放在最后面
13 }
14 fmt.Println("ex",arr)
15 }
16 return arr
17}
18
19
20func HeapSortMax(arr[] int,length int ) []int{
21 //length:=len(arr)//数组长度
22 if length <=1{
23 return arr //一个元素的数组,直接返回
24 }else{
25 depth:=length/2-1 //深度(顶点的最大深度), n 2*n+1,2*n+2 ,树的数量等于depth+1个
26 for i:=depth;i>=0;i--{ //循环所有的三节点
27 topmax:=i //假定最大的在i的位置 ,
28 leftchild:=2*i+1
29 rightchild:=2*i+2 //左右孩子的节点
30 if leftchild <=length-1 && arr[leftchild]>arr[topmax]{ //防止越界
31 topmax=leftchild //如果左边比我大,记录最大
32 }
33 if rightchild<=length-1 && arr[rightchild]>arr[topmax]{
34 topmax=rightchild //如果右边比我大,记录最大
35 }
36 if topmax!=i{ //确保i的值就是最大
37 arr[i],arr[topmax]=arr[topmax],arr[i]
38 }
39 }
40 return arr
41 }
42}
43func main(){
44 arr:=[]int {1,9,2,8,3,7,4,6,5,10}
45 fmt.Println(HeapSort(arr))
46}
1[10 1 7 8 9 2 4 6 5 3]
2ex [3 1 7 8 9 2 4 6 5 10]
3[9 3 7 8 1 2 4 6 5 10]
4ex [5 3 7 8 1 2 4 6 9 10]
5[8 5 7 3 1 2 4 6 9 10]
6ex [6 5 7 3 1 2 4 8 9 10]
7[7 5 6 3 1 2 4 8 9 10]
8ex [4 5 6 3 1 2 7 8 9 10]
9[6 5 4 3 1 2 7 8 9 10]
10ex [2 5 4 3 1 6 7 8 9 10]
11[5 2 4 3 1 6 7 8 9 10]
12ex [1 2 4 3 5 6 7 8 9 10]
13[4 3 1 2 5 6 7 8 9 10]
14ex [2 3 1 4 5 6 7 8 9 10]
15[3 2 1 4 5 6 7 8 9 10]
16ex [1 2 3 4 5 6 7 8 9 10]
17[2 1 3 4 5 6 7 8 9 10]
18ex [1 2 3 4 5 6 7 8 9 10]
19[1 2 3 4 5 6 7 8 9 10]
20ex [1 2 3 4 5 6 7 8 9 10]
21[1 2 3 4 5 6 7 8 9 10]
快速排序
利用递归,在内存中处理, 把数组元素分成 左,中,右 3堆
1package main
2
3import (
4 "fmt"
5 "math/rand"
6)
7
8//3,9,2,8,1,7,4,6,5,10
9//3 9,2,8,1,7,4,6,5,10
10// 2,1 3, 9,,8,7,4,6,5,10
11
12// 9,2,8,,7,4,6,5,10
13// ,8,7,4,6,5 9 10
14//4 5 6
15
16func QuickSort(arr []int) []int {
17 length := len(arr) //数组长度
18 if length <= 1 {
19 return arr //一个元素的数组,直接返回
20 } else {
21 splitdata := arr[0] //以第一个为基准
22 low := make([]int, 0, 0) //存储比我小的
23 high := make([]int, 0, 0) //存储比我大的
24 mid := make([]int, 0, 0) //存储与我相等
25 mid = append(mid, splitdata) //加入第一个相等
26
27 for i := 1; i < length; i++ {
28 if arr[i] < splitdata {
29 low = append(low, arr[i])
30 } else if arr[i] > splitdata {
31 high = append(high, arr[i])
32 } else {
33 mid = append(mid, arr[i])
34 }
35 }
36 low, high = QuickSort(low), QuickSort(high) //切割递归处理
37 myarr := append(append(low, mid...), high...)
38 return myarr
39 }
40}
41
42func QuickSort2(arr []int) []int {
43 length := len(arr) //数组长度
44 if length <= 1 {
45 return arr //一个元素的数组,直接返回
46 } else {
47 //n:=length-1//n>=0 && n<=length-1
48 n := rand.Int() % length
49 splitdata := arr[n] //以第一个为基准
50 low := make([]int, 0, 0) //存储比我小的
51 high := make([]int, 0, 0) //存储比我大的
52 mid := make([]int, 0, 0) //存储与我相等
53 mid = append(mid, splitdata) //加入第一个相等
54
55 for i := 0; i < length; i++ {
56 if i == n {
57 continue
58 }
59 if arr[i] < splitdata {
60 low = append(low, arr[i])
61 } else if arr[i] > splitdata {
62 high = append(high, arr[i])
63 } else {
64 mid = append(mid, arr[i])
65 }
66 }
67 low, high = QuickSort(low), QuickSort(high) //切割递归处理
68 myarr := append(append(low, mid...), high...)
69 return myarr
70 }
71}
72
73func main() {
74 arr := []int{3, 9, 2, 8, 1, 7, 4, 6, 5, 10}
75 fmt.Println(QuickSort2(arr))
76}
1func binarySearch( []int,search int ) int {
2 low = 0
3 height :=len(mid) - 1
4 for low <=height {
5 mid := (low+height) /2
6 middata :=n[mid]
7 if middata < search {
8 low = mid +1
9 }else if middata > search {
10 height = mid -1
11 }else{
12 return mid
13 }
14 }
15 return -1
16}