首页 > 代码库 > 【算法导论学习-015】基数排序(Radix sort)

【算法导论学习-015】基数排序(Radix sort)

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; }}