白话桶排序

白话桶排序

核心原理

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

通俗步骤

  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. 仅适合范围可控的数据。
相关推荐
ambition2024213 小时前
操作系统同步:读者-写者问题与读写公平法详解(附每个 PV 操作含义)
linux·开发语言·数据结构·unix
mCell19 小时前
Lua 编程入门:从基础语法到元表
javascript·算法·lua
wuyk55520 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无21 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
不会代码的小猴21 小时前
3. 控件学习1
开发语言·c++·笔记·qt·算法
疯狂打码的少年1 天前
【数据结构】图的存储结构:邻接矩阵与邻接表
数据结构·笔记
203号居民1 天前
LeetCode hot 100 —41. 缺失的第一个正数
数据结构·算法·leetcode
专注仿真1 天前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
地平线开发者1 天前
量化为什么会有损失:从量化误差到精度下降
算法