go語言實現7大排序演算法

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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    }}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.