将待排序序列中的所有元素统一成一样的数位长度,数位较短的数在前面补零
从最低位开始,依次进行排序
从最低位到最高位排序完成后,序列就变成了有序序列
public static int[] sort(int[] array){ ? // 找数组中最大值 int max = array[0]; for (int i = 1; i < array.length; i++) { if (array[i] > max){ max = array[i]; } } ? // 得到最大值的位数 int length = (max + "").length(); ? // 建立一个桶 int[][] bucket = new int[10][array.length]; // 记录每个桶存放了多少数据 int[] bucketCount = new int[10]; ? for (int i = 1; i <= length; i++) { ? // 求位数(个,十,百......),并放入桶中 for (int j = 0; j < array.length; j++) { ? /** * 位数,规律为: * 个位数:array[j] / 1 % 10 <===> array[j] / (1 * 10 ^ 0) % 10 * 十位数:array[j] / 10 % 10 <===> array[j] / (1 * 10 ^ 1) % 10 * 百位数:array[j] / 100 % 10 <===> array[j] / (1 * 10 ^ 2) % 10 * ...... */ int num = (int) ((array[j] / (1 * Math.pow(10, (i - 1)))) % 10); // 放到桶里,第几个桶(num)的第几个位置(bucketCount[num]) bucket[num][bucketCount[num]] = array[j]; // 桶数据加一 bucketCount[num] ++; } ? // 从桶中取出,放到原来的数组中 // 数组下标索引 int count = 0; // 第一层,10个桶 for (int k = 0; k < 10; k++) { ? // 如果这个桶中有元素 if (bucketCount[k] != 0) { // 第二层,每个桶中的值 for (int z = 0; z < bucketCount[k]; z++) { array[count] = bucket[k][z]; count ++; } } // 该桶中的值取完后,把桶计数清零 bucketCount[k] = 0; } ? // 所有的桶取完后,对桶清零 for (int j = 0; j < bucket.length; j++) { for (int k = 0; k < bucket[i].length; k++) { bucket[j][k] = 0; } } } ? return array; }
2000万个随机数,使用基数排序进行测试,费时大概 5秒 左右
public static void main(String[] args) { ? int[] array = new int[20000000]; for (int i = 0; i < 20000000; i++) { array[i] = (int)(Math.random() * 20000000); } ? Date date = new Date(); long start = date.getTime(); String formatDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); ? System.out.println("排序前的时间为:" + formatDate); ? sort(array); ? Date dateAfter = new Date(); long end = dateAfter.getTime(); String formatDateAfter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); ? System.out.println("排序后的时间为:" + formatDateAfter); System.out.println("排序总共费时" + ((end - start) / 1000) + "s!"); ? }
原文:https://www.cnblogs.com/LittleSkinny/p/14419717.html