使用GOLANG實現猴子排序
阿新 • • 發佈:2018-09-01
從大到小 方法 port 代碼 一個 ++ package unix UNC 實現方法(一)
利用rand函數進行隨機輸出,代碼如下:
利用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實現猴子排序