/**
* 简化版桶算法
* 通过一维数组保存对应数字在一维数组中出现的个数,然后遍历一维数组达到排序的效果
* 这里一位数组是排序列表的范围,必须10以内的数字列表排序, 则一维数组大小为11 (N+1)
*
* 涉及知识点:
* @随机数功能
* @时间处理和格式化
*/
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var scoreList [11]int
score := [5]int{5, 3, 5, 2, 8}
for _, v := range score {
scoreList[v]++
}
fmt.Println(scoreList)
var result []int
// fmt.Printf("%T, %T\n", result, scoreList)
// 从小到大
for i := 1; i <= 10; i++ {
for j := 1; j <= scoreList[i]; j++ {
fmt.Println(i, j)
result = append(result, i)
}
}
fmt.Println(result)
var result2 []int
// 从大到小
for i := 10; i >= 0; i-- {
for j := 1; j <= scoreList[i]; j++ {
result2 = append(result2, i)
}
}
fmt.Println(result2)
fmt.Println("<-------------------------------->")
// 获取随机数个数
randCount := 50
randRandMax := 100
bucketMax := randRandMax + 1
// make 创建切片,已经初始化完毕。在append的话,前面值都为0
// randList := make([]int, randCount)
var randList []int
bucket := make([]int, bucketMax)
seed := rand.New(rand.NewSource(time.Now().UnixNano()))
for index := 0; index < randCount; index++ {
number := seed.Intn(randRandMax)
// fmt.Println(number)
randList = append(randList, number)
}
fmt.Println("原始列表: ", randList)
for _, v := range randList {
bucket[v]++
}
var result3 []int
startTime := time.Now()
for i := randRandMax; i >= 0; i-- {
for j := 1; j <= bucket[i]; j++ {
result3 = append(result3, i)
}
}
fmt.Println("排序列表: ", result3)
duration := time.Since(startTime)
fmt.Println("耗时:", duration)
}
执行结果:
$ go run demo.go
[0 0 1 1 0 2 0 0 1 0 0]
2 1
3 1
5 1
5 2
8 1
[2 3 5 5 8]
[8 5 5 3 2]
<-------------------------------->
原始列表: [80 57 35 27 2 1 87 31 85 96 42 1 82 65 0 16 13 9 40 90 11 38 12 52 40 96 2 7 37 68 75 96 85 34 8 0 95 44 41 34 14 85 87 77 82 33 14 60 37 86]
排序列表: [96 96 96 95 90 87 87 86 85 85 85 82 82 80 77 75 68 65 60 57 52 44 42 41 40 40 38 37 37 35 34 34 33 31 27 16 14 14 13 12 11 9 8 7 2 2 1 1 0 0]
耗时: 8.834µs
网友评论