1、《算法导论》P197页 8.3节Radix sort
2、java实现
这里仅仅对【算法导论学习-014】计数排序 的参数进行了修改,同时仅仅修改了一行代码。
/** * 创建时间:2014年8月17日 下午4:05:48 * 项目名称:Test * @author Cao Yanfeng * @since JDK 1.6.0_21 * 类说明: 利用计数排序实现基数排序 * 条件:待排序的所有数位数相同,注意,即便不相同,也可以认为是最多那个位数,如下面的例子可以认为都是3位数 */ public class RadixSortTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] array ={73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 33, 100}; int[] result=radixSort(array, 3); for (int i = 0; i < result.length; i++) { System.out.println(result[i]); } } public static int[] radixSort(int[] array, int d) { int length=array.length; int[] digits=new int[length]; for (int i = 1; i <= d; i++) { for (int j = 0; j < length; j++) { int a=(int)Math.pow(10, i); int b=(int)Math.pow(10, i-1); digits[j]=array[j]%a/b; }<pre name="code" class="java" style="font-size: 16px; line-height: 24px;"> /* 根据每一位的值对原数组进行排序 */
array=countingSort(digits, 9, array); } return array; } /* 计数排序,注意java数组下标从0开始,所以temp的长度为k+1, */ public static int[] countingSort(int[] array, int k,int[]
originalArray) { int[] temp = new int[k + 1]; int[] result = new int[array.length]; for (int i = 0; i < k; i++) { temp[i] = 0; } for (int i = 0; i < array.length; i++) { temp[array[i]] = temp[array[i]] + 1; } for (int i = 1; i < temp.length;
i++) { temp[i] += temp[i - 1]; } /* temp[array[i]]为所有数字的计数,即数组长度,注意下标为temp[array[i]]-1 */ for (int i = array.length-1; i >=0; i--) { /* * 关键点:不大于array[i]的元素有temp[array[i]]个,则array[i]的排序位置是temp[array[i]]-1 */// result[temp[array[i]] - 1] = array[i];
result[temp[array[i]] - 1] = originalArray[i]; temp[array[i]] = temp[array[i]] - 1; } return result; }}
【算法导论学习-015】基数排序(Radix sort)