使用GOLANG實現猴子排序

來源:互聯網
上載者:User

實現方法(一)
利用rand函數進行隨機輸出,代碼如下:

package mainimport "fmt"import "math/rand"import "time"//確定一個切片是否是從大到小排列的,如果是返回“真”,不是則返回“假”。func isOrdered(list []int) bool {    for i := 1; i < len(list); i++ {        if list[i-1] > list[i] { //如果存在前一個元素大於後一個,則返回“假”            return false        }    }    return true}//讓切片中的元素隨機排列func randList(list []int) {    duplicateList := make([]int, len(list))    copy(duplicateList, list)        //用copy函數進行切片複製,這樣下面修改源切片(list)才不會影響到切片副本(duplicateList)    rand.Seed(time.Now().UnixNano()) //使用當前的UNIX時間作為種子,不同的種子才能產生不同的隨機值    index := rand.Perm(len(list))    //使用rand.Perm(n)函數產生一個[0:n)的隨機切片,並按照隨機切片中的元素順序對源切片進行排序    for i, k := range index {        list[i] = duplicateList[k]    }}func main() {    list := []int{1, 4, 3, 6, 9, 7, 2, 8, 5, 0}    count := 0    for {        if isOrdered(list) {            fmt.Printf("\t排序完成!\n\t已排序%v次。\n\t排序結果為 %v\n", count, list)            break        } else {            randList(list)            count++        }    }}

實現方法(二)
利用map每次的輸出為隨機值進行排序(實際發現這種方法不靠譜,其中幾個結果的出現頻率特別高,經常重複,等了很久也不能輸出正確結果)
代碼如下:

package mainimport (    "fmt")//將一個切片轉換為map,其中切片的元素的值為map的key,map的value統一為0func list2map(list []int) map[int]int {    m := make(map[int]int)    for _, v := range list {        m[v] = 0    }    return m}//將map的key輸出為切片,map的輸出是無序的,所以每次的輸出都應該是隨機的。func map2list(m map[int]int) []int {    list := []int{}    for i := range m {        list = append(list, i)    }    return list}//確定一個切片是否是從大到小排列的,如果是返回“真”,不是則返回“假”。func isOrdered(list []int) bool {    for i := 1; i < len(list); i++ {        if list[i-1] > list[i] { //如果存在前一個元素大於後一個,則返回“假”            return false        }    }    return true}func main() {    list := []int{3, 5, 2, 1}    m := list2map(list)    count := 0    for {        if isOrdered(list) {            fmt.Printf("\t排序完成!\n\t已排序%v次。\n\t排序結果為 %v\n", count, list)            break        } else {            list = map2list(m)            fmt.Println(list)            count++        }    }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.