基数排序

I. 计数排序

  1.  简介:N 个在 0-k 之间的输入元素排序,O(N) = N + k;

  2.  思想: 对于每个输入元素 x,确定小于x的元素个数,直接将x插入到输出数组的对应位置;

  3. 详细代码如下:

/**
 * Created by zf on 2017/12/13 0013.
 */
public class CountingSort {

    /**
     * 计数排序:对 n 个 0-k 之间数排序 O(n+k)
     * 对输入的每个元素 x, 确定小于x的元素个数,然后直接将x放到输出数组的对应位置
     *
     * @param k x的最大值
     * @param inputArray 输入数组
     * @param outArray 输出数组
     */
    public static void sort(int k, int[] inputArray, int[] outArray) {
        int[] temp = new int[k + 1];
        // 统计inputArray 中各元素个数
        for (int anInputArray : inputArray) {
            temp[anInputArray] = temp[anInputArray] + 1;
        }
        // 统计所有小于等于自己的元素个数
        for (int i = 1; i < temp.length; i++) {
            temp[i] = temp[i] + temp[i - 1];
        }
        //根据小于自己的元素个数,将元素直接放到输出数组的对应位置
        for (int i = inputArray.length - 1; i >= 0; i--) {
            outArray[temp[inputArray[i]] - 1] = inputArray[i];
            temp[inputArray[i]] = temp[inputArray[i]] - 1;
        }
    }

    public static void main(String[] args) {
        int k = 100;
        int[] A = new int[]{13, 58, 2, 9, 79, 37, 97, 2, 36, 75, 64, 99, 100, 0, 0};
        int[] B = new int[A.length];
        sort(k, A, B);
        for (int i : B) {
            System.out.println(i);
        }
    }

}
View Code

 II. 基数排序

  1. 基本:

    a. 对给定的 n 个 d 位数,其中每一位都有k个可能的取值,从最低位开始,按位对n个数字进行稳定排序[相同时不会改变输入输出顺序],

d次排序之后就能得到正确的排序;

    b. 假设每次按位使用稳定排序的时间复杂度为O(n)=(n+k)[计数排序],则该排序的O(n)=d(n+k);

  2. 扩展:

    a. 对给定 n 个 b 位数和任意整数 r<= b, 则可以将 每个关键字看做 d [d=b/r] 个 r 位数,则 r位数的每一位的最大值为 2r-1 [b的每一位为2进制数],则可使用 基数排序,其复杂度为 O(n) = (b/r)(n+2r-1);

    b. 例如对n个32位的数字排序, b=32, r=8, d=32/8=4; 则复杂度O(n) = 4 * (28 - 1 + n);

    c. 

    

  

 

posted @ 2017-12-14 20:13  执风  阅读(1185)  评论(0编辑  收藏  举报