算法思想:基數排序又稱爲「桶子法」,從低位開始將待排序的數按照這一位的值放到相應的編號爲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