现在的位置: 首页 > 综合 > 正文

基数排序Java实现

2018年01月26日 ⁄ 综合 ⁄ 共 928字 ⁄ 字号 评论关闭
public class RadixSort {
    public static void sort(int[] number, int d) {//d表示最大的数有多少位
        int k=0;
        int n=1;
        int m=1;//控制键值排序依据在哪一位
        int[][] temp = new int[10][number.length];//数组的第一维表示可能的余数0-9
        int[] order = new int[10];//数组order[i]用来表示该位是i的数的个数</span>
        while(m <= d) {
            for(int i = 0; i < number.length; i++) {
                int lsd = ((number[i] / n) % 10);
                temp[lsd][order[lsd]] = number[i];
                order[lsd]++;
            }
            for(int i = 0; i < 10; i++) {
                if(order[i] != 0)
                    for(int j = 0; j < order[i]; j++) {
                        number[k] = temp[i][j];
                        k++;
                    }
                order[i] = 0;
            }
            n *= 10;
            k = 0;
            m++;
        }
    }
    public static void main(String[] args) {
        int[] data =
                {73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 33, 100};
        RadixSort.sort(data, 3);
        for(int i = 0; i < data.length; i++) {
            System.out.print(data[i] + " ");
        }
    }
}

时间效率:

设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(radix),共进行d趟分配和收集。 

空间效率:需要2*radix个指向队列的辅助空间,以及用于静态链表的n个指针。

核心点:
1、使用一个二维数组
int[][] temp = new int[10][number.length]
行是每个元素每一位可能的数字0-9,列数是待排序数组的元素个数,因为可能有所有元素某一位数字都相同的情况。
2、使用一个一维数组
int[] order = new int[10]
代表某一位相同的元素的个数,用来输出

抱歉!评论已关闭.