這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
package mainimport ( "fmt" "math/rand" "time" // "os" // "os/signal")const ( num = 100000 rangeNum = 100000)func main() { randSeed := rand.New(rand.NewSource(time.Now().Unix() + time.Now().UnixNano())) var buf []int for i := 0; i < num; i++ { buf = append(buf, randSeed.Intn(rangeNum)) } t := time.Now() //冒泡排序 // maopao(buf) // 選擇排序 // xuanze(buf) // 插入排序 // charu(buf) //希爾排序 // xier(buf) //快速排序 // kuaisu(buf) // 歸併排序 // guibing(buf) // 堆排序 duipai(buf) // fmt.Println(buf) fmt.Println(time.Since(t)) //等待退出 // c := make(chan os.Signal, 1) // signal.Notify(c, os.Interrupt, os.Kill) // <-c // fmt.Println("Receive ctrl-c")}// 冒泡排序func maopao(buf []int) { times := 0 for i := 0; i < len(buf)-1; i++ { flag := false for j := 1; j < len(buf)-i; j++ { if buf[j-1] > buf[j] { times++ tmp := buf[j-1] buf[j-1] = buf[j] buf[j] = tmp flag = true } } if !flag { break } } fmt.Println("maopao times: ", times)}// 選擇排序func xuanze(buf []int) { times := 0 for i := 0; i < len(buf)-1; i++ { min := i for j := i; j < len(buf); j++ { times++ if buf[min] > buf[j] { min = j } } if min != i { tmp := buf[i] buf[i] = buf[min] buf[min] = tmp } } fmt.Println("xuanze times: ", times)}// 插入排序func charu(buf []int) { times := 0 for i := 1; i < len(buf); i++ { for j := i; j > 0; j-- { if buf[j] < buf[j-1] { times++ tmp := buf[j-1] buf[j-1] = buf[j] buf[j] = tmp } else { break } } } fmt.Println("charu times: ", times)}// 希爾排序func xier(buf []int) { times := 0 tmp := 0 length := len(buf) incre := length // fmt.Println("buf: ", buf) for { incre /= 2 for k := 0; k < incre; k++ { //根據增量分為若干子序列 for i := k + incre; i < length; i += incre { for j := i; j > k; j -= incre { // fmt.Println("j: ", j, " data: ", buf[j], " j-incre: ", j-incre, " data: ", buf[j-incre]) times++ if buf[j] < buf[j-incre] { tmp = buf[j-incre] buf[j-incre] = buf[j] buf[j] = tmp } else { break } } // fmt.Println("middle: ", buf) } // fmt.Println("outer: ", buf) } // fmt.Println("outer outer: ", buf, " incre: ", incre) if incre == 1 { break } } // fmt.Println("after: ", buf) fmt.Println("xier times: ", times)}// 快速排序func kuaisu(buf []int) { kuai(buf, 0, len(buf)-1)}func kuai(a []int, l, r int) { if l >= r { return } i, j, key := l, r, a[l] //選擇第一個數為key for i < j { for i < j && a[j] > key { //從右向左找第一個小於key的值 j-- } if i < j { a[i] = a[j] i++ } for i < j && a[i] < key { //從左向右找第一個大於key的值 i++ } if i < j { a[j] = a[i] j-- } } //i == j a[i] = key kuai(a, l, i-1) kuai(a, i+1, r)}//歸併排序func guibing(buf []int) { tmp := make([]int, len(buf)) merge_sort(buf, 0, len(buf)-1, tmp)}func merge_sort(a []int, first, last int, tmp []int) { if first < last { middle := (first + last) / 2 merge_sort(a, first, middle, tmp) //左半部分排好序 merge_sort(a, middle+1, last, tmp) //右半部分排好序 mergeArray(a, first, middle, last, tmp) //合并左右部分 }}func mergeArray(a []int, first, middle, end int, tmp []int) { // fmt.Printf("mergeArray a: %v, first: %v, middle: %v, end: %v, tmp: %v\n", // a, first, middle, end, tmp) i, m, j, n, k := first, middle, middle+1, end, 0 for i <= m && j <= n { if a[i] <= a[j] { tmp[k] = a[i] k++ i++ } else { tmp[k] = a[j] k++ j++ } } for i <= m { tmp[k] = a[i] k++ i++ } for j <= n { tmp[k] = a[j] k++ j++ } for ii := 0; ii < k; ii++ { a[first+ii] = tmp[ii] } // fmt.Printf("sort: buf: %v\n", a)}// 堆排序func duipai(buf []int) { temp, n := 0, len(buf) for i := (n - 1) / 2; i >= 0; i-- { MinHeapFixdown(buf, i, n) } for i := n - 1; i > 0; i-- { temp = buf[0] buf[0] = buf[i] buf[i] = temp MinHeapFixdown(buf, 0, i) }}func MinHeapFixdown(a []int, i, n int) { j, temp := 2*i+1, 0 for j < n { if j+1 < n && a[j+1] < a[j] { j++ } if a[i] <= a[j] { break } temp = a[i] a[i] = a[j] a[j] = temp i = j j = 2*i + 1 }}