目录结构与文件内容
|- bucketSort
— bucketSort.go
— bucketSort_test.go
bucketSort.go
package bucketSort
type LinkList struct {
// 头结点不负责存储!
Head *Node
}
type Node struct {
Val int
Next *Node
}
// 桶排序
func bucketSort(s []int, max int) {
buckets := make([]LinkList, len(s))
for i := 0; i < len(buckets); i++ {
buckets[i].Head = &Node{}
}
sort0(buckets, s, max)
sort1(buckets, s)
}
// 将元素放到桶中
func sort0(buckets []LinkList, s []int, max int) {
n := len(s)
for _, v := range s {
if head := buckets[v*n/(max+1)].Head; head != nil {
for head.Next != nil {
// v 不比node小则往后稍,否则就插到node前面
if v > head.Next.Val {
head = head.Next
} else {
node := &Node{Val: v, Next: head.Next}
head.Next = node
break
}
}
if head.Next == nil {
node := &Node{Val: v, Next: head.Next}
head.Next = node
}
}
}
}
// 从桶中取回元素到s
func sort1(bucket []LinkList, s []int) {
index := 0
for i := 0; i < len(bucket); i++ {
head := bucket[i].Head
for head.Next != nil {
s[index] = head.Next.Val
index++
head = head.Next
}
}
}
bucketSort_test.go
package bucketSort
import (
"fmt"
"math/rand"
"testing"
)
func TestBucketSort(t *testing.T) {
var s []int
max := 2000
for i := 0; i < 30; i++ {
s = append(s, rand.Intn(max))
}
fmt.Println(s)
bucketSort(s, max)
fmt.Println(s)
}
func BenchmarkBucketSort(b *testing.B) {
var s []int
max := 2000
for i := 0; i < 30; i++ {
s = append(s, rand.Intn(max))
}
fmt.Println("origin", s)
b.StartTimer()
for i := 0; i < b.N; i++ {
bucketSort(s, max)
}
b.StopTimer()
fmt.Println("sorted", s)
}
测试结果
BenchmarkBucketSort
origin [81 1887 1847 59 81 1318 425 540 456 1300 694 511 162 1089 728 1274 1211 1445 1237 1106 495 1466 1528 258 47 1947 287 888 790 1015]
sorted [47 59 81 81 162 258 287 425 456 495 511 540 694 728 790 888 1015 1089 1106 1211 1237 1274 1300 1318 1445 1466 1528 1847 1887 1947]
origin [1541 408 1387 831 1429 1356 1737 631 1485 1026 413 1090 1194 563 433 147 78 324 159 1353 1957 1721 1189 199 1000 705 888 538 1703 1355]
sorted [78 147 159 199 324 408 413 433 538 563 631 705 831 888 1000 1026 1090 1189 1194 1353 1355 1356 1387 1429 1485 1541 1703 1721 1737 1957]
origin [451 510 605 156 266 1828 1561 1202 783 1746 1563 376 1002 1718 1447 1094 1577 1463 1996 420 623 953 1137 1133 1241 59 1033 643 1891 2]
sorted [2 59 156 266 376 420 451 510 605 623 643 783 953 1002 1033 1094 1133 1137 1202 1241 1447 1463 1561 1563 1577 1718 1746 1828 1891 1996]
origin [878 1336 546 1107 1940 503 552 1843 205 1598 1425 1351 1515 1757 1687 10 1410 1285 590 1632 1098 553 591 582 1384 1297 1267 137 1271 1894]
sorted [10 137 205 503 546 552 553 582 590 591 878 1098 1107 1267 1271 1285 1297 1336 1351 1384 1410 1425 1515 1598 1632 1687 1757 1843 1894 1940]
BenchmarkBucketSort-8 400354 2724 ns/op
PASS