基数排序

tech2022-10-17  120

基数排序

个人理解

基数排序抓住了排序的特点在于,排序就是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)); } } }
最新回复(0)