lxy15329

 

插入排序,归并排序和冒泡排序(怎么以前觉得那么难呢?)

 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大的一头开始了。

posted on 2013-01-24 19:34  lxy15329  阅读(1284)  评论(0编辑  收藏  举报

导航