插入排序,归并排序和冒泡排序(怎么以前觉得那么难呢?)
1 // mergesort project main.go 2 package main 3 4 import ( 5 "fmt" 6 ) 7 8 func main() { 9 array := []int{25, 18, 23, 54, 27, 95, 12, 36, 5, 49, 32} 10 arrays := array[:] 11 MergeSort(arrays, 0, len(arrays)-1) 12 display(arrays) 13 } 14 15 func MergeSort(arrays []int, low, high int) { 16 if low < high { 17 mid := (low + high) / 2 18 MergeSort(arrays, low, mid) 19 MergeSort(arrays, mid+1, high) 20 merge(arrays, low, mid+1, high) 21 } 22 23 } 24 func merge(arrays []int, low, mid, high int) { 25 midrec := mid 26 lowrec := low 27 array := make([]int, high-low+1) 28 count := 0 29 for low < midrec && mid <= high { 30 if arrays[low] <= arrays[mid] { 31 array[count] = arrays[low] 32 low++ 33 } else { 34 array[count] = arrays[mid] 35 mid++ 36 } 37 count++ 38 } 39 for low < midrec { 40 array[count] = arrays[low] 41 low++ 42 count++ 43 } 44 for mid <= high { 45 array[count] = arrays[mid] 46 mid++ 47 count++ 48 } 49 for i := 0; i < (high - lowrec + 1); i++ { 50 arrays[lowrec+i] = array[i] 51 } 52 } 53 54 func display(arrays []int) { 55 for i := 0; i < len(arrays); i++ { 56 fmt.Print(arrays[i], "\t") 57 } 58 fmt.Println() 59 }
归并排序,跟名字一样,最主要的步骤就是归并。把两个已经有序的序列合并为一个序列。这里原来比较迷惑的就是确定low,mid,high。在合并时候,老是出错,忘记了一个问题,指针是会移动的,如果后面需要用到,要提前将结果保存下来。找了好久的问题,实在是不应该啊。
插入排序跟平时玩牌时候大家放排的习惯很一样,都是将一个个元素插入到一个有序序列中,通过移动的方式实现。
1 // insertsort project main.go 2 package main 3 4 import ( 5 "fmt" 6 ) 7 8 func main() { 9 array := []int{25, 36, 54, 23, 15, 36, 87, 1, 69, 48, 62, 47} 10 arrays := array[:] 11 fmt.Println("before sort:") 12 display(arrays) 13 InsertSort(arrays) 14 fmt.Println("after sort:") 15 display(arrays) 16 } 17 18 func InsertSort(arrays []int) { 19 size := len(arrays) 20 for i := 1; i < size; i++ { 21 if arrays[i] < arrays[i-1] { 22 temp := arrays[i] 23 var j int 24 for j = i - 1; j >= 0 && arrays[j] > temp; j-- { 25 arrays[j+1] = arrays[j] 26 } 27 if j == -1 { 28 arrays[0] = temp 29 } else { 30 arrays[j+1] = temp 31 } 32 } 33 display(arrays) 34 } 35 } 36 func display(arrays []int) { 37 for i := 0; i < len(arrays); i++ { 38 fmt.Print(arrays[i], "\t") 39 } 40 fmt.Println() 41 }
1 // bubblesort project main.go 2 package main 3 4 import ( 5 "fmt" 6 ) 7 8 func main() { 9 array := []int{25, 18, 23, 54, 27, 95, 12, 36, 5, 49, 32} 10 arrays := array[:] 11 BubbleSort(arrays) 12 display(arrays) 13 } 14 func BubbleSort(arrays []int) { 15 size := len(arrays) 16 for i := 1; i <= size; i++ { 17 for j := size - 1; j >= i; j-- { 18 if arrays[j] < arrays[j-1] { 19 swap(&arrays[j], &arrays[j-1]) 20 } 21 } 22 } 23 } 24 func swap(numa, numb *int) { 25 temp := *numa 26 *numa = *numb 27 *numb = temp 28 } 29 30 func display(arrays []int) { 31 for i := 0; i < len(arrays); i++ { 32 fmt.Print(arrays[i], "\t") 33 } 34 fmt.Println() 35 }
上面的冒泡算法是可以优化的,我没有写。我一直在找一个正确的冒泡排序写法,所谓正确就是对得起冒泡这个名字,可是现在也没有找到。我理解的冒泡就是较小的气泡向上浮动,所以就从size大的一头开始了。