[算法]桶排序

红太狼 2022-04-03 14:46 316阅读 0赞

介绍

桶排序是分治算法的应用.
桶排序实际上就是把要排序的容器中的数据,分别按照大小跨度
分散在若干个桶中,如果桶中有一个以上的数据,则单独的桶进行
排序,最后把每个桶从最小区间跨度-最大区间跨度遍历,即可得到
有序数组.

缺点

不适合数据分布不均匀的序列中.

思路

在这里插入图片描述

代码实现

  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.Collections;
  4. public class bucketSort {
  5. public static void main(String[] args) {
  6. int[] array = new int[] {20,73,1,9,100,103,8};
  7. int[] sortedArray = bucketSort(array);
  8. System.out.println(Arrays.toString(sortedArray));
  9. System.out.println(Arrays.toString(array));
  10. }
  11. public static int[] bucketSort(int[] arr) {
  12. //1.先找到桶中最大的值和最小的值
  13. int max = arr[0];
  14. int min = arr[0];
  15. for (int i = 0; i < arr.length; i++) {
  16. if (min < arr[i]) {
  17. min = arr[i];
  18. }
  19. if (max > arr[i]) {
  20. max = arr[i];
  21. }
  22. }
  23. //2.求出差值,这两步先忽略为什么这么做,后面会告诉
  24. int diffValue = max - min;
  25. //3.初始化桶,有多少个元素我们初始化多少桶,桶我们使用Arraylist来模拟,我们先生成一个装桶的容器也使用Arraylist
  26. ArrayList<ArrayList<Integer>> bucketList = new ArrayList<>();
  27. for (int i = 0; i < arr.length; i++) {
  28. //上面已经指定泛型,无需再次指定泛型
  29. bucketList.add(new ArrayList<>());
  30. }
  31. //4.把每个元素放入分别放入对应的桶中
  32. //但是我们需要先求出每个桶的区间,需要怎么求呢?
  33. // 假设数组为{20,17,19,16}
  34. /*为了保证区间是在最大值和最小值之间,
  35. * 我们先使用最大值减去最小值,再除以数组长度
  36. * 既最大值-最小值/arr.length
  37. * 这样我们就得到了这样的四个桶区间,
  38. * 每个桶的区间跨度是20-16/arr.length=1
  39. * 但是我们只是求除了每个统之间的跨度,并没有求出在桶中的位置
  40. * 假如我们分了四个桶
  41. * 16-17
  42. * 17-18
  43. * 18-19
  44. * 19-20
  45. * 桶的索引是0-3
  46. * {20,17,19,16}
  47. *
  48. * 17应该在索引为1的桶中
  49. * 3代表是整个桶的整体,对应的是min到max的区间
  50. * 1代表min-17这一所以
  51. * 1/3=(16-17)/(16-20)
  52. * (元素[i]-元素[min])/(max-min)=元素在哪个桶/桶的最大数量(arr.length-1)
  53. * 元素在哪个桶=((元素[i]-元素[min])/(max-min))*桶的最大数量(arr.length-1)
  54. * 把结果强转成int即可
  55. * */
  56. for (int i = 0; i < arr.length; i++) {
  57. //找到在元素中的那个位置,并添加到相应的桶中
  58. int index = (int) ((arr[i] - min) * (arr.length - 1) / diffValue);
  59. bucketList.get(index).add(arr[i]);
  60. }
  61. //5.对每个元素大于1的桶进行排序
  62. for (ArrayList<Integer> integers : bucketList) {
  63. if (integers.size() > 1) {
  64. Collections.sort(integers);
  65. }
  66. }
  67. //6.定义新数组,把所有桶进行遍历,然后放入新数组中
  68. int[] newArr = new int[arr.length];
  69. int count = 0;
  70. for (int i = 0; i < bucketList.size(); i++) {
  71. for (int j = 0; j < bucketList.get(i).size(); j++) {
  72. newArr[count++] = bucketList.get(i).get(j);
  73. }
  74. }
  75. return newArr;
  76. }
  77. }

参考自什么是桶排序`

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法 - 排序

    前言 桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使

    相关 算法排序

    计数排序、桶排序、基数排序均为O(n)算法 桶排序可以看成是计数排序的升级版,它将要排的数据分到多个有序的桶里,每个桶里的数据再单独排序,再把每个桶的数据依次取出,即可

    相关 排序算法-排序

    先创建若干个桶,每个桶存放不同范围的数据 桶和桶之间的跨度=(数据最大值-数据最小值)/ (桶的数量 - 1) 假设有一个数组:1.2,0.5,4.5,2.6,2.7

    相关 [算法]排序

    介绍 桶排序是分治算法的应用. 桶排序实际上就是把要排序的容器中的数据,分别按照大小跨度 分散在若干个桶中,如果桶中有一个以上的数据,则单独的桶进行 排序,最