基数排序
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); } } }
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.