基数排序

原理

  • 通过(arr[i]+””).length获得最大数的位数
  • 从0到9创建10个桶
  • 从个位开始,个十百千将数组中的数按顺序放入桶中,不足的按0算
  • 依次将他们从桶中取出
  • 再分别放入高一位次的桶中
  • 依次取出
  • 直至到最大位数

    代码实现

    ```javascript import java.util.Arrays;

/**

  • @author laoduan
  • @create 2020-05-09-22:20 */ public class RadixSort { public static void main(String[] args) {
    1. int arr[] = {53,3,542,748,14,214};
    2. radixSort(arr);
    }
  1. public static void radixSort(int[] arr){
  2. //得到数组中最大的数的位数
  3. int max = arr[0];
  4. for(int i =1;i<arr.length;i++){
  5. if(arr[i]>max){
  6. max=arr[i];
  7. }
  8. }
  9. int maxLength = (max+"").length();
  10. //二维数组包含10个一位数组
  11. //为了防止在放入数的时候数据溢出,则每个一位数组大小定为arr.length
  12. //基数排序是使用空间换时间的经典算法
  13. int [][] bucket = new int[10][arr.length];
  14. //为了记录每个桶中实际存放了多少个数组,定义一个一位数组来记录每个桶每次放入的数据个数
  15. int [] bucketElementCounts = new int [10];
  16. for (int i = 0, n = 1;i<maxLength;i++,n*=10){
  17. for (int j=0 ; j<arr.length ;j++){
  18. //取出每个元素个位的值
  19. int digitOfElement = arr[j]/n%10;
  20. //放入对应的桶中
  21. bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
  22. bucketElementCounts[digitOfElement]++;
  23. }
  24. //按照这个桶的顺序(一位数组的下标一次取出数据,放入原来数组)
  25. int index = 0;
  26. for (int k = 0;k<bucketElementCounts.length;k++){
  27. //如果桶中有数据,则放入原数组
  28. if(bucketElementCounts[k]!=0){
  29. for (int l = 0;l<bucketElementCounts[k];l++){
  30. arr[index++] = bucket[k][l];
  31. }
  32. }
  33. /**
  34. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  35. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  36. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  37. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  38. */
  39. //第l轮处理后,需要将每个bucketElementCounts[k] = 0
  40. /**
  41. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  42. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  43. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  44. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  45. */
  46. bucketElementCounts[k]= 0;
  47. }
  48. System.out.println("第"+(i+1)+"轮排序后的结果是"+ Arrays.toString(arr));
  49. }
  50. }

}

```