桶排序简介

概念

桶排序是一种线性时间复杂度的排序算法,它通过将待排序元素分配到不同的桶中,对每个桶中的元素进行排序,然后按照桶的顺序依次将元素取出,从而实现排序的目的。

算法步骤

  1. 创建一个固定数量的桶,并确定每个桶的范围。
  2. 遍历待排序数组,将每个元素放入对应的桶中。
  3. 对每个桶中的元素进行排序,可以使用其他排序算法如插入排序、快速排序等。
  4. 按照桶的顺序,依次将每个桶中的元素取出,即可得到有序数组。

算法特点

  • 桶排序适用于待排序元素分布均匀的情况,对于分布不均匀的数据,可能导致桶的数量不均衡,影响排序效率。
  • 桶排序是稳定的排序算法,相同元素的相对顺序不会改变。
  • 桶排序的时间复杂度为O(n+k),其中n为待排序元素数量,k为桶的数量。

优点

  • 桶排序是一种高效的排序算法,适用于大量数据的排序。
  • 相比于比较排序算法,桶排序不需要进行元素之间的比较,因此在某些情况下可以更快地完成排序。

缺点

  • 桶排序需要额外的空间来存储桶,如果待排序元素数量较大,可能会占用较多的内存空间。
  • 对于分布不均匀的数据,可能导致桶的数量不均衡,影响排序效率。

适用场景

  • 桶排序适用于待排序元素分布均匀的情况,例如在对年龄、成绩等具有一定范围的数据进行排序时。
  • 当待排序元素数量较大,且数据分布较为均匀时,桶排序可以提供较高的排序效率。

实现代码

java 复制代码
import java.util.ArrayList;
import java.util.Collections;

public class BucketSort {
    public static void bucketSort(int[] arr, int bucketSize) {
        if (arr.length < 2) {
            return;
        }

        int minValue = arr[0];
        int maxValue = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < minValue) {
                minValue = arr[i];
            } else if (arr[i] > maxValue) {
                maxValue = arr[i];
            }
        }

        int bucketCount = (maxValue - minValue) / bucketSize + 1;
        ArrayList<ArrayList<Integer>> buckets = new ArrayList<>(bucketCount);
        for (int i = 0; i < bucketCount; i++) {
            buckets.add(new ArrayList<>());
        }

        for (int i = 0; i < arr.length; i++) {
            int bucketIndex = (arr[i] - minValue) / bucketSize;
            buckets.get(bucketIndex).add(arr[i]);
        }

        int currentIndex = 0;
        for (int i = 0; i < bucketCount; i++) {
            Collections.sort(buckets.get(i));
            for (int j = 0; j < buckets.get(i).size(); j++) {
                arr[currentIndex++] = buckets.get(i).get(j);
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {29, 25, 14, 37, 64, 21, 45, 36, 12, 18};
        bucketSort(arr, 5);

        System.out.println("排序结果:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}
相关推荐
袋鼠云数栈3 分钟前
集团数字化统战实战:统一数据门户与全业态监管体系构建
大数据·数据结构·人工智能·多模态
小月球~39 分钟前
天梯赛 · 并查集
数据结构·算法
仍然.1 小时前
算法题目---模拟
java·javascript·算法
三道渊2 小时前
C语言:文件I/O
c语言·开发语言·数据结构·c++
kali-Myon3 小时前
CTFshow-Pwn142-Off-by-One(堆块重叠)
c语言·数据结构·安全·gdb·pwn·ctf·
潇冉沐晴3 小时前
DP——背包DP
算法·背包dp
GIOTTO情4 小时前
2026 世界互联网大会亚太峰会|AI 时代媒介投放的技术实战与算法优化
人工智能·算法
逆境不可逃4 小时前
LeetCode 热题 100 之 543. 二叉树的直径 102. 二叉树的层序遍历 108. 将有序数组转换为二叉搜索树 98. 验证二叉搜索树
算法·leetcode·职场和发展
计算机安禾4 小时前
【数据结构与算法】第19篇:树与二叉树的基础概念
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
副露のmagic4 小时前
哈希章节 leetcode 思路&实现
算法·leetcode·哈希算法