基数排序
个人理解
基数排序抓住了排序的特点在于,排序就是0-9的阿拉伯数组比较,而且0-9越来越大,而且规则在于位数多的肯多大于位数少的。
那我先准备好0-9个篮子,然后把这个数一位一位的往里面放,然后我从0-9的遍历,循环起来,是不是就可以排序了呢?
举个例子
比如我的序列是 0,2,4,3,1,5,那我准备个0-9的篮子
然后从左到右,0放到0号篮子,2到2号……
最后我从0-9遍历,那结果不就是,0,1,2,3,4,5了么
有人问,那位数多了呢?
那我一位一位比较咯,比完了重新一遍排序不就可以了么?
接着先对个位数排序,然后十位数排序,依次对位数更高的排序
这样巧妙的一个点在于每次排序之后的低位都是有序的,然后当位数取余为0的时候(没有对应的高位),那么直接取出它就是对应的顺序了。
至于怎么想到的这么巧妙的算法,我也奇怪。
我们只能说用假说演绎法来证明这个算法的正确了
以下转载自基数排序
上面这幅图,或许你已经在其他的博客里见到过。这是一个很好的引导跟说明。在基数排序里,我们需要一个很大的二维数组,二维数组的大小是 (10 * n)。10 代表的是我们每个元素的每一位都有 10 种可能,也就是 10 进制数。在上图中,我们是以每个数的个位来代表这个数,于是,5428 就被填充到了第 8 个桶中了。下次再进行填充的时候,就是以十位进行填充,比如 5428 在此时,就会选择以 2 来代表它。
代码实现之
package sort;
import java.util.Arrays;
public class RadixSort
{
public static void main(String[] args)
{
int[] arr =
{ 7, 8, 2, 36, 8, 4, 2, 456, 21, 5647 };
radixSort(arr);
}
public static void radixSort(int[] arr)
{
int max = arr[0];
for (int i = 0; i < arr.length; i++)
{
if (max < arr[i])
{
max = arr[i];
}
}
int maxLength = (max + "").length();
// 定义十个桶
int[][] bucket = new int[10][arr.length];
int[] bucketElementCounts = new int[10];
// -----------------第一次--------------------
for (int k = 0, div = 1; k < maxLength; k++, div *= 10)
{
// 先分桶
for (int i = 0; i < arr.length; i++)
{
int digitOfElement = arr[i] / div % 10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]++] = arr[i];
}
// 拿出来覆盖之前的序列,之前的序列成为低位有序的序列
int index = 0;
// 遍历 1-10
for (int i = 0; i < bucketElementCounts.length; i++)
{
// 遍历每个桶
for (int j = 0; j < bucketElementCounts[i]; j++)
{
arr[index++] = bucket[i][j];
}
bucketElementCounts[i]=0;
}
System.out.println("第"+(k+1)+"次:");
System.out.println(Arrays.toString(arr));
}
}
}