桶排序思想下的算法——基数排序
基数排序的使用条件要保证数据是十进制的数(否则需要自己改写基数排序)
图解过程如下:
代码挺不好理解的,实在理解不了用队列来写(我觉得我用不了多久就忘了)
public static void radixSort(int[] arr) { if (arr == null || arr.length < 2) { return; } radixSort(arr, 0, arr.length - 1, maxBits(arr)); } //计算数组中最多有几个十进制位 //找最大值,循环/10记录一次。 private static int maxBits(int[] arr) { int max = Integer.MIN_VALUE; for (int i = 0; i < arr.length; i++) { max = Math.max(max, arr[i]); } int res = 0; while (max != 0) { res++; max /= 10; } return res; } public static void radixSort(int[] arr, int left, int right, int digit) { final int radix = 10; //保证是十进制数 int i = 0; int j = 0; int[] bucket = new int[right - left + 1]; for (int d = 1; d <= digit; d++) { //先从d位开始,依次d+1位,d+2位..... //10个空间[0...9] //count[0]当前位(d位)上是0的数字有几个 //count[1]当前位(d位)上是(0,1)的数字有几个 //count[2]当前位(d位)上是(0,1,2)的数字有几个 //count[i]当前位(d位)上是(0~i)的数字有几个 int[] count = new int[radix]; for (i = left; i <= right; i++) { j = getDigit(arr[i], d); //取arr[i]上第d位的数 count[j]++; } for (i = 1; i < radix; i++) { count[i] = count[i] + count[i - 1]; } for (i = right; i >= left; i--) { j = getDigit(arr[i], d); bucket[count[j] - 1] = arr[i]; count[j]--; } //拷贝回原数组 for (i = left, j = 0; i <= right; i++, j++){ arr[i] = bucket[j]; } } } //分别取d位,d+1位,d+2位....上的数字 public static int getDigit(int x, int d) { return ((x / ((int) Math.pow(10, d - 1))) % 10); }
随便拿几个数测试了一下:
学习的博客多用于在笔记中,防止笔记过于臃肿,所以将样例及运行结果放在博客中,后以超链接的形式记录在笔记中,所以有些博文过于单薄。如果有小伙伴遇到问题欢迎评论,看到就会回复,学渣一枚,加油努力。