根据待排序数据元素的数量,选定一定数量的桶将元素均匀分布到各个桶中,对每个桶进行桶内排序(稳定或不稳定取决于具体问题)
    排好后再依次将桶中元素取出

    时间复杂度 O(n + m)其中n为输入规模,m为桶的个数

    为了使桶排序更加高效,我们需要做到这两点:

    1. 在额外空间充足的情况下,尽量增大桶的数量
    2. 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中

    桶排序.png

    1. import java.util.*;
    2. public class Main {
    3. static final int SIZE = 100000; //每个桶的范围大小
    4. public static void main(String[] args) {
    5. Scanner sc = new Scanner(System.in);
    6. int n = sc.nextInt();
    7. int[] a = new int[n];
    8. for (int i = 0; i < n; i++)
    9. a[i] = sc.nextInt();
    10. //找最大最小值
    11. int max = a[0], min = a[0];
    12. for (int i = 1; i < a.length; i++) {
    13. max = Math.max(a[i], max);
    14. min = Math.min(a[i], min);
    15. }
    16. //确定桶的个数
    17. int bs = (max - min) / SIZE + 1;
    18. List<Integer>[] b = new ArrayList[bs];
    19. for (int i = 0; i < bs; i++)
    20. b[i] = new ArrayList<>();
    21. for (int i = 0; i < a.length; i++) {
    22. int idx = (a[i] - min) / SIZE;
    23. b[idx].add(a[i]);
    24. }
    25. int idx = 0;
    26. for (int i = 0; i < bs; i++) {
    27. if (!b[i].isEmpty()) {
    28. Collections.sort(b[i]); //这里也可以自己实现桶内排序
    29. for (int x : b[i])
    30. a[idx++] = x;
    31. }
    32. }
    33. for (int i = 0; i < n; i++) {
    34. System.out.print(a[i] + " ");
    35. }
    36. }
    37. }