基数排序

基本思想: 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。 然后 从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

演示:

这里写图片描述

Java代码:

import java.util.Arrays;
public class LinearTimeSorter { 
    /**
     * 基数排序。将每个int(32位)拆分为8个4位组(或许拆分成4个8位组更好),
     * 对每个四位组采用计数排序(最大值为15)。
     * 
     * 注意:该算法只能对非负整数进行排序。
     */
     private static final int BITS_PER_GROUPS = 4;
    private static final int GROUPS_COUNT = 31 / BITS_PER_GROUPS + 1;


    private static final int[] MASK_TABLE = new int[GROUPS_COUNT];
    static {
        MASK_TABLE[0] = (1 << BITS_PER_GROUPS) - 1;
        for (int i = 1; i < MASK_TABLE.length; i++) {
            MASK_TABLE[i] = MASK_TABLE[i-1] << BITS_PER_GROUPS;
        }
    };

    public static void radixSort(int[] array) {
        // 对8个4位组进行排序
        for (int j = 0; j < GROUPS_COUNT; j++) {
            int mask = MASK_TABLE[j];

            // 使用计数排序对4位组进行排序
            int[] counting = new int[1 << BITS_PER_GROUPS];
            for (int i = 0; i < array.length; i++) {
                counting[(array[i] & mask) >>> (j*BITS_PER_GROUPS)]++;
            }           
            for (int i = 1; i < counting.length; i++) {
                counting[i] += counting[i-1];
            }

            int[] tempArray = new int[array.length];
            for (int i = array.length - 1; i >= 0 ; i--) {
                tempArray[--counting[(array[i] & mask) >>> (j*BITS_PER_GROUPS)]] = array[i];
            }
            // copy back
            System.arraycopy(tempArray, 0, array, 0, tempArray.length);
        }
    }

    public static void main(String[] args) {
        int[] a = new int[] { 13, 30, 5, 21, 17, 25, 3, 9 , 2000};
        radixSort(a);
        System.out.println(Arrays.toString(a));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值