(一)前言
刚刚学完老韩的基数排序法,跑到这里写一篇博客记录一下,防止自己忘记。
(二)方法介绍
基数排序法是继承自桶排序,所以它是一个典型的空间换取时间的排序算法。
(三)例子介绍
1、首先以下面这个数组为数据
int[] arr = {53, 3, 542, 748, 14, 214}
2、然后再定义10个桶,这里桶主要是用于存储相同位上数字相同的数字(也就是个位相同的放在一起、十位相同的放在一起、百位相同的放在一起)(当然,这是一个向上递增的过程,不是一下子 个十百 全部做完)。
3、然后按照规则,将数据放到桶中
4、再将数据按从左至右把它取出来
取出来的数据覆盖原来的arr数组
arr = {542,53,3,14,214,748}
5、再重复2、3步骤,将数据放进去又取出来……
注意:现在的规则要按十位、百位 来了
……
由此我们可以发现,随着2、3 步骤的不断进行,小的数慢慢就排在了前面,这样就是基数排序法地端倪了。
(四)代码解释
(在这里我先插入一段代码,后面解读)
package RadixSorting;
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int[] arr = {53,3,542,748,14,214};
radixSorting(arr);
System.out.println(Arrays.toString(arr));
}
/**
* 基数排序
*/
public static void radixSorting(int[] arr){
int max = arr[0];
for(int element: arr){
if(element > max){
max = element;
}
}
int maxLength = (max + "").length();
int[][] bucket = new int[10][arr.length]; //定义10个桶存放数据
int[] bucketElementCounts = new int[10]; //定义10个计数器用于记录每个桶的数据
for(int i = 0,n = 1;i < maxLength;++i,n*=10){
//往桶里和计数器里存放相应的数据
for(int j = 0;j < arr.length;++j){
int digitOfElement = arr[j] / n % 10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
bucketElementCounts[digitOfElement]++;
}
//取出数据重新放到arr[][]数组之中
int index = 0;
for(int k = 0;k < bucketElementCounts.length;++k){
if(bucketElementCounts[k] != 0){
for(int l = 0;l < bucketElementCounts[k];++l){
arr[index] = bucket[k][l];
index++;
}
}
bucketElementCounts[k] = 0;
}
}
}
}
1)main()方法准备
public static void main(String[] args) {
int[] arr = {53,3,542,748,14,214};
radixSorting(arr);
System.out.println(Arrays.toString(arr));
}
这个比较简单,就不赘述了,读者也可以看明白
2)radixSorting方法
因为是桶排序,所以我们需要准备桶
int[][] bucket = new int[10][arr.length];
- 当我们检索这个桶的时候,我们需要一个索引指针,当然,在
JAVA
中,索引完全可以用一个int类型的index替代。 - 我们需要为每一个桶准备一个指针,所以定义一个数组,数组中的每个数字对应着的上面桶中到底有几个数字
int[] bucketElementCounts = new int[10];
后面就是基数排序法的核心代码
for(int i = 0,n = 1;i < maxLength;++i,n*=10){
//往桶里和计数器里存放相应的数据
for(int j = 0;j < arr.length;++j){
int digitOfElement = arr[j] / n % 10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
bucketElementCounts[digitOfElement]++;
}
//取出数据重新放到arr[][]数组之中
int index = 0;
for(int k = 0;k < bucketElementCounts.length;++k){
if(bucketElementCounts[k] != 0){
for(int l = 0;l < bucketElementCounts[k];++l){
arr[index] = bucket[k][l];
index++;
}
}
bucketElementCounts[k] = 0;
}
}
- 最外面的for循环主要为的是需要的排序次数,及从个 --> 十 --> 百 --> ……的比较次数,用
i < maxlength
判断。 - 中间第一层for是往桶中放数据的过程。
- 后面的for是将桶中数据按顺序取出的过程。注意这里有一关键的一步,就是
-
bucketElementCounts[k] = 0;
它保证了每次放入、取出都没有上一次的数据干扰。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。