算法思想:基数排序又称为“桶子法”,从低位开始将待排序的数按照这一位的值放到相应的编号为0~9的桶中。等到低位排完获得一个子序列,再将这个序列按照次低位的大小进入相应的桶中,一直排到最高位为止,数组排序完成。java
算法过程:算法
1.求出数组中最大元素值的位数 例:1(一位) 10(二位) 100(三位)数组
2.依据过程一算得的位数,依次按个位数,十位数,百位数,千位数,从低位到高位对数组元素进行排序。假若数组中最大值是789(3位),依次按个位数,十位数,百位数,对数组元素进行(3次)排序。app
过程2 中用到了一个二位数组来暂存数组元素,bucket数组最后一位用于记录放进去的元素数量。测试
int[][] bucket = new int[10][elements.length+1];
按个位数排序时,若是有一个元素,个位数是3,那么这个元素就会被存到bucket[3][?]中,并对bucket数组最后一个元素+1.net
按十位数,百位数,千位数排序时亦然。code
public static void baseNumSort(int[] elements) { String[] temp = {"个","十","百","千"}; int max = getMax(elements); for(int i=1;i<=max;i++) { System.out.println("按"+temp[i-1]+"位数排序"); sort(elements,i); System.out.println("排序后获得的数组:"+Arrays.toString(elements)); } } /** * 将数组elements中的元素按指定位数值的大小排序 * @param elements * @param ext 1--个位 2--十位 3--百位 依次类推 */ private static void sort(int[] elements, int ext) { int[][] bucket = new int[10][elements.length+1]; int extNum = 0; int count = 0; for(int i=0;i<elements.length;i++) { extNum = getPointNum(elements[i], ext); count = bucket[extNum][elements.length]; bucket[extNum][count] = elements[i]; bucket[extNum][elements.length] = count + 1; } System.out.println("----------------------------------bucket----------------------------------"); for(int i=0;i<10;i++) { System.out.print(i+"-->\t"); for(int j=0;j<elements.length+1;j++) { System.out.print(bucket[i][j]+"\t"); } System.out.println(); } System.out.println("----------------------------------bucket----------------------------------"); int k = 0; for(int i=0;i<10;i++) { count = bucket[i][elements.length]; if(count > 0) { for(int j=0;j<count;j++) { elements[k++] = bucket[i][j]; } } } } /** * 获取参数number指定位数上的值 * @param number 整数 * @param point 1--个位 2--十位 3--百位 依次类推 * @return 参数number指定位数上的值 */ private static int getPointNum(int number, int point) { int base = 1; for(int k = 1; k < point; k++) { base = 10 * base; } return number/base%10; } /** * 获取数组中最大元素值的位数 * @param elements * @return */ private static int getMax(int[] elements) { int maxElement = elements[0]; for(int i=1;i<elements.length;i++) { if(elements[i] > maxElement) { maxElement = elements[i]; } } int base = 10; int ext = 1; while(maxElement >= base) { ++ext; base = 10 * base; } System.out.println("数组中最大值的位数:"+ext); return ext; }
测试:blog
public static void main(String[] args) { int[] array = {82 ,31 ,29 ,71, 72, 42, 64, 5, 110}; baseNumSort(array); }
结果:排序
数组中最大值的位数:3 按个位数排序 ----------------------------------bucket---------------------------------- 0--> 110 0 0 0 0 0 0 0 0 1 1--> 31 71 0 0 0 0 0 0 0 2 2--> 82 72 42 0 0 0 0 0 0 3 3--> 0 0 0 0 0 0 0 0 0 0 4--> 64 0 0 0 0 0 0 0 0 1 5--> 5 0 0 0 0 0 0 0 0 1 6--> 0 0 0 0 0 0 0 0 0 0 7--> 0 0 0 0 0 0 0 0 0 0 8--> 0 0 0 0 0 0 0 0 0 0 9--> 29 0 0 0 0 0 0 0 0 1 ----------------------------------bucket---------------------------------- 排序后获得的数组:[110, 31, 71, 82, 72, 42, 64, 5, 29] 按十位数排序 ----------------------------------bucket---------------------------------- 0--> 5 0 0 0 0 0 0 0 0 1 1--> 110 0 0 0 0 0 0 0 0 1 2--> 29 0 0 0 0 0 0 0 0 1 3--> 31 0 0 0 0 0 0 0 0 1 4--> 42 0 0 0 0 0 0 0 0 1 5--> 0 0 0 0 0 0 0 0 0 0 6--> 64 0 0 0 0 0 0 0 0 1 7--> 71 72 0 0 0 0 0 0 0 2 8--> 82 0 0 0 0 0 0 0 0 1 9--> 0 0 0 0 0 0 0 0 0 0 ----------------------------------bucket---------------------------------- 排序后获得的数组:[5, 110, 29, 31, 42, 64, 71, 72, 82] 按百位数排序 ----------------------------------bucket---------------------------------- 0--> 5 29 31 42 64 71 72 82 0 8 1--> 110 0 0 0 0 0 0 0 0 1 2--> 0 0 0 0 0 0 0 0 0 0 3--> 0 0 0 0 0 0 0 0 0 0 4--> 0 0 0 0 0 0 0 0 0 0 5--> 0 0 0 0 0 0 0 0 0 0 6--> 0 0 0 0 0 0 0 0 0 0 7--> 0 0 0 0 0 0 0 0 0 0 8--> 0 0 0 0 0 0 0 0 0 0 9--> 0 0 0 0 0 0 0 0 0 0 ----------------------------------bucket---------------------------------- 排序后获得的数组:[5, 29, 31, 42, 64, 71, 72, 82, 110]
参考:element