import java.util.Arrays;
public class DistributionCounting {
public static int[] distributionSort(int a[], int l, int u) {
int i = 0, j = 0;
int d[] = new int[10];
int s[] = new int[10];
for (j = 0; j <= u - l; j++)
d[j] = 0;
for (i = 0; i < a.length; i++)
d[a[i] - l] += 1;
for (j = 1; j <= u - l; j++)
d[j] += d[j - 1];
for (i = a.length - 1; i >= 0; i--) {
j = a[i] - l;
s[d[j] - 1] = a[i];
d[j]--;
}
return s;
}
public static void main(String[] argv) {
int a[]=new int[]{10,8,9,10,9,9};
System.out.println(Arrays.toString(distributionSort(a, 8, 10)));
}
}
时间复杂度O(n)
分布计数指出了在有序数组中,它们的元素最后一次出现时的正确位置。
利用了输入数组独特的属性,待排序的元素的值都来自于一个已知的小集合