image.png
    一、桶排序:
    本质是统计词频。
    桶的数量要优先才可以。

    image.png
    如果不是数字而是对象的时候,需要用累加和统计数组来确定对应关系。
    二、基数排序
    按照个十百位依次进桶。
    image.png
    如果用队列来实现:

    1. public class T9_Sort_Radix {
    2. public static void main(String[] args) {
    3. int [] arr = {103,102,101};
    4. process(arr);
    5. }
    6. public static int getMaxLen(int [] arr){
    7. int l = 1;
    8. int base = 10;
    9. for(int i = 0 ; i < arr.length ; i++){
    10. while(arr[i] /base > 0 ){
    11. l++;
    12. base *= 10;
    13. }
    14. }
    15. return l;
    16. }
    17. public static void process(int [] arr ){
    18. Queue<Integer> [] queues = new Queue[9];
    19. int maxLen = getMaxLen(arr);
    20. int divide = 1;
    21. for(int l = 1; l <=maxLen; l++){
    22. for(int i = 0 ; i < arr.length ; i ++){
    23. int bucket = arr[i] / divide % 10 ;
    24. if(queues[bucket] == null){
    25. queues[bucket] = new LinkedList<>() ;
    26. }
    27. queues[bucket].add(arr[i] );
    28. }
    29. int cur = 0;
    30. for(int i = 0; i < queues.length; i ++){
    31. while(queues[i] !=null && queues[i].size()>0 ){
    32. arr[cur++] = queues[i].poll();
    33. }
    34. }
    35. divide *=10;
    36. }
    37. System.out.println(Arrays.toString(arr));
    38. }
    39. }

    step1: 找最大数有多少位,因为小的数前面要补0;
    左程云的函数:
    有点问题,如果最大数是0的话, 那么res就是0了,但实际0也是1位数。
    image.png
    申请桶
    image.png
    这个第几个桶,在申请额外桶空间的时候没有申请0~10个桶。其实是申请了10个桶,只不过使用累加次品表表示的
    就是代码中的int[] count = new int[ radix]
    注意:
    1、j = getDigit(arr[i], d) 是求的当前位的数字,
    image.png
    2、他上面一行,是从右往左进行遍历的,这样能保证后面出现的依然在后面,(左程云:保证先入桶的先出)
    image.png
    实际上就是 桶排序的算法, 用一个count前缀和 模拟分片。
    image.png
    image.png

    1. /**
    2. * @author 张伟-算法
    3. * @version 1.0
    4. * @date 2021/9/9 6:07 下午
    5. */
    6. public class T8_Sort_Bucket {
    7. public static void main(String[] args) {
    8. int[] arr = {1,2,2,3,5,4,4};
    9. process(arr);
    10. }
    11. public static void process(int[]arr ){
    12. int max = arr[0];
    13. for(int i = 1; i<arr.length ; i ++){
    14. max = Math.max(max, arr[i]);
    15. }
    16. int[] buckets = new int [max + 1];
    17. for(int i = 0 ; i < arr.length ; i ++){
    18. buckets[arr[i]] ++;
    19. }
    20. /**累加桶数组*/
    21. for(int i = 1; i < buckets.length; i ++){
    22. buckets[i] = buckets[i] + buckets[i-1];
    23. }
    24. int [] res = new int [arr .length];
    25. for(int i = arr.lengh-1; i >= 0; i--){
    26. int no = arr[i];
    27. int chair = --buckets[no];
    28. res[chair] = no;
    29. }
    30. /**这里也可以把res的结果重新赋给arr,所以额外空间复杂度就是buckes的数量 + arr 的长度*/
    31. System.out.println(Arrays.toString(res));
    32. }
    33. }