白话桶排序

白话桶排序

核心原理

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

通俗步骤

  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. 仅适合范围可控的数据。
相关推荐
Thomas214320 分钟前
spark sort shuffer 和 hash shuffer 图解对比
算法·哈希算法
AbandonForce39 分钟前
简谈线程池
开发语言·c++·算法
智购科技智能售货柜1 小时前
2026自动售货机商品掉落声学计数方案:从麦克风到频谱识别的工程实践~YH
人工智能·算法
土司大王1 小时前
LeetCode hot100——实现 Trie (前缀树)
java·算法·leetcode
水龙吟啸1 小时前
华为研发岗AI方向9.9机考题复盘&分析
人工智能·python·算法·华为
小七在进步1 小时前
类和对象(一)
java·数据结构·算法
Y_Bk1 小时前
2026 ICPC EC网络预选赛第一场
算法
CarIise1 小时前
C语言字符串基础:从char数组到双指针反转算法
算法
佳児素花痴╮1 小时前
C++速通2
开发语言·c++·算法
麻瓜code2 小时前
【LeetCode】相交链表:双指针法,一次遍历找到交点
算法·leetcode·链表