排序6:基数排序

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序6:基数排序相关的知识,希望对你有一定的参考价值。

这篇文章更详细一些

基数排序的方式可以采用最低位优先LSD(Least sgnificant digital)法或最高位优先 MSD(Most sgnificant digital)法,LSD的排序方式由键值的最右边开始,而MSD 则相反,由键值的最左边开始。我们这里使用LSD法,原理就是一个数组我们首先根据 他的个位进行排序,然后在根据十位,百位......,这里最多排到多少位是根据他的最大 值确定的,如果最大值有千位,我们必须要计算到千位,如果最多只有十位,我们就计 算到十位就可以了,每一位都排序完了之后,数组也就排序成功了,来看一下代码:

public static void radixSort(int[] array) {
        int digitCount = 10;
        int maxCount = getBitCount(getMaxNum(array));
        int radix = 1;
        int[][] tempArray = new int[digitCount][array.length];
        for (int i = 0; i < maxCount; i++) {
            int[] count = new int[digitCount];
            for (int j = 0; j < array.length; j++) {
                int temp = ((array[j] / radix) % 10);
                tempArray[temp][count[temp]++] = array[j];
            }
            int index = 0;
            for (int j = 0; j < digitCount; j++) {
                if (count[j] == 0) {
                    continue;
                }
                for (int k = 0; k < count[j]; k++) {
                    array[index++] = tempArray[j][k];
                }
            }
            radix *= 10;
        }
    }

    public static int getBitCount(int num) {
        int count = 1;
        int temp = num / 10;
        while (temp != 0) {
            count++;
            temp /= 10;
        }
        return count;
    }

    public static int getMaxNum(int array[]) {
        int max = array[0];
        for (int i = 1, lengh = array.length; i < lengh; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        return max;
    }

写个测试方法吧:

  int array2[] = {2, 16, 97, 13, 15, 11, 89, 7, 63, 21, 66, 8, 0};
  radixSort(array2);
  System.out.println(Arrays.toString(array2));

结果完全正确。

但是这个方法的问题是不能处理负数。

以上是关于排序6:基数排序的主要内容,如果未能解决你的问题,请参考以下文章

基数排序

6.桶排序 计数排序 基数排序

排序6:基数排序

排序 | 基数排序

6.比较排序之快速排序

基数排序段错误