1. 程式人生 > >使用GOLANG實現猴子排序

使用GOLANG實現猴子排序

從大到小 方法 port 代碼 一個 ++ package unix UNC

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

package main

import "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 main

import (
    "fmt"
)

//將一個切片轉換為map,其中切片的元素的值為map的key,map的value統一為0
func 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++
        }
    }
}

使用GOLANG實現猴子排序