Golang 数据结构与算法 —— 桶排序

目录结构与文件内容

|- 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值