白话桶排序

白话桶排序

核心原理

确定数组元素的最大值和最小值,根据元素个数创建同样数量的桶,每个桶代表一个区间,依次把数装入桶,分别对桶内元素单独排序,最后按桶的顺序依次取出所有元素,完成排序。

通俗步骤

  1. 先创建若干个有序的桶(区间容器);
  2. 按元素大小,把数据依次放入对应区间桶;
  3. 每个桶内部单独排序;
  4. 按桶的顺序依次取出所有元素,整体完成排序。

举例演示 29, 25, 9, 49, 12, 43

确定大小值范围

min:9

max:49

确定区间范围

step = (max - min) / 数组长度 = (49-9) / 6 ≈ 6.67 -> 7

创建区间桶并依次填入数据

桶区间 桶数据
3-10 9
11-18 12
19-26 25
27-34 29
35-42
43-50 49,43

桶内单独排序

桶区间 桶数据
3-10 9
11-18 12
19-26 25
27-34 29
35-42
43-50 43,49

依次回填数据

9,12,25,29,43,49

代码示例

go 复制代码
package main

import (
	"fmt"
	"sort"
)

func bucketSort(arr []int) []int {
	if len(arr) == 0 {
		return arr
	}

	// 1. 求最大、最小值
	minVal, maxVal := arr[0], arr[0]
	for _, v := range arr {
		if v < minVal {
			minVal = v
		}
		if v > maxVal {
			maxVal = v
		}
	}

	n := len(arr)
	bucketNum := n
	step := float64(maxVal-minVal) / float64(bucketNum)

	// 2. 初始化桶
	buckets := make([][]int, bucketNum)

	// 3. 元素放入对应桶
	for _, num := range arr {
		idx := int((float64(num) - float64(minVal)) / step)
		// 边界处理:最大值避免下标越界
		if idx == bucketNum {
			idx--
		}
		buckets[idx] = append(buckets[idx], num)
	}

	// 4. 桶内排序 + 拼接结果
	var res []int
	for _, bucket := range buckets {
		sort.Ints(bucket)
		res = append(res, bucket...)
	}
	return res
}

func main() {
	nums := []int{29, 25, 9, 49, 12, 43}
	sortedNums := bucketSort(nums)
	fmt.Println(sortedNums)		// [9 12 25 29 43 49]
}

局限性

  1. 依赖数据分布,分布不均效率暴跌;
  2. 需要额外空间存放桶;
  3. 仅适合范围可控的数据。
相关推荐
computersciencer1 分钟前
应用贝叶斯公式:迟到了,那坐的是哪种交通工具呢?
算法·机器学习·概率论
若亦_5 分钟前
排序>>交换排序
java·数据结构·算法
念何架构之路15 分钟前
Go 标准库 database/sql 详解
数据库·sql·golang
努力努力再努力wz23 分钟前
【Lua 入门系列】Lua数据结构:从 Table 出发,一文串联数组、链表、栈、队列、集合、映射与树的实现原理
数据结构·链表·lua
modelmd32 分钟前
Go 切片、映射常见使用场景
开发语言·后端·golang
dialect_9 小时前
KMP算法
开发语言·c++·算法
reikocao9 小时前
卡尔曼滤波的动态机制:P如何改变融合权重
算法
漂流瓶jz10 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
吞下星星的少年·-·10 小时前
Div.2 CF 1130B题(构造,贪心)
算法·贪心·构造
是main不是漫11 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法