首页 > 代码库 > 第八章 线性时间排序 8.3 基数排序

第八章 线性时间排序 8.3 基数排序

package chap08_Linear_Time_Sort;

import static org.junit.Assert.*;

import java.util.Arrays;

import org.junit.Test;

public class CopyOfSortAlgorithms {
    /**
     * 基数排序
     * 
     * @param n
     * @param digit
     */
    static void radixSort(int[] n, int digit) {
        int[] b = new int[n.length];// 临时存储数组
        int[] c = new int[10];// 用于记录各个位上的数个数
        int d = 1;// 用来记录位数,从各位到最大数的位数
        int div = 1;// 作为除数,从各位到最大位,10,100,1000,10000.....

        while (d <= digit) {
            for (int i = 0; i < n.length; i++) {
                c[(n[i] / div) % 10]++;
            }
            for (int j = 1; j < 10; j++) {
                c[j] += c[j - 1];
            }
            for (int k = n.length - 1; k >= 0; k--) {
                b[c[(n[k] / div) % 10] - 1] = n[k];
                c[(n[k] / div) % 10]--;
            }
            System.arraycopy(b, 0, n, 0, b.length);
            Arrays.fill(c, 0);
            div *= 10;
            d++;
        }
    }

    @Test
    public void testName() throws Exception {
        int[] a = { 329, 457, 657, 839, 436, 72, 35, 1 };
        System.out.println(Arrays.toString(a));
        radixSort(a, 3);
        System.out.println(Arrays.toString(a));
    }
}