基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶排序”(bucket sort)。为了说明这一算法,我们先以基数排序的一个特例鸽巢排序(Pigeonhole sort)来进行讲解。
鸽巢排序
1、数组中没有重复的元素,且每个元素都>=0
先考虑一种最简单的情况,对一个数组array:{11, 13, 56, 23, 63, 98 ,87}进行排序,注意这个数组中没有重复的元素,且都是>=0,那么:
第一步:遍历这个数组,找出其中最大数字(maxNum)
第二步:创建一个辅助数组bucketArray,大小是maxNum+1,辅助元素中的每一个元素称之为一个"桶"
第三步:遍历待排序的数组array,将每一个元素分配(distribution)到辅助数组bucketArray中,分配的方式很简单,bucketArray[array[i]]=array[i],即直接将这个位置上的数字array[i]作bucketArray数组的下标,并给其赋值为array[i],即数组的下标和数组元素的值是相同的
第四步:可以看到,经过第三步排序之后,辅助数组bucketArray中的元素已经有序的了,现在只需要迭代辅助数组,将不是null的元素依次拷贝到待排序数组中,即完成了排序
代码实现如下:
- public class PigeonholeSort {
- /**
- * 第一种情况:所有元素都>=0
- */
- public static void sort(int[] arr){
- //第一步,确定数组中最大的元素
- int max=arr[0];
- for (int i : arr) {
- if(i>max){
- max=i;
- }
- }
- //第二步:创建辅助数组,大小为max+1,注意这里是Integer,所以默认每个元素的值都是null
- Integer[] bucketArray=new Integer[max+1];
- //第三步:将数组中的分配到bucket数组中
- for (int i = 0; i < array.length; i++) {
- bucketArray[array[i]-minNum]=array[i];
- }
- //第四步:迭代辅助数组,将不是null的元素依次拷贝到待排序数组中
- &n