基数排序
从个位开始排序,然后依次十位,百位等。从个位从小到大排序......
有一些数据
需要十个桶存放这些数据
第一轮排序先按照个位进行排序
排完序取出:
发现还是无序数组,然后进行十位排序
下一步排百位
依次放进去就排好序了。
1.看图写逻辑 2.纠正细节
桶怎么表示?——> 二维数组
先把二维数组画出来。
代码表示:int[][] bucket = new int[10][arr.length];
桶的个数 桶的高度
大概画一下桶
数组的默认值为0。
数据放入到桶当中需要定义一个游标,进行遍历,放入桶
利用图式先捋清楚逻辑再写代码。
定义游标为i
找到每位数的个位数:int element = arr[i] % 10; //一个数除以它的余数就是个位数
首先第一个数为41
element为1
如何把数据放入到桶当中去?
第一个维度横坐标就是它的值1,第二个维度
需要有一个特殊的数组下标桶记录,
需要一个桶记录:记录桶当中有多少个数值。elementCount读取出来的。
核心代码
倒出数据,两次遍历,定义k, k遍历桶记录,第二次遍历 遍历桶
public static void sort(int[] args) {
int[][] bucket = new int[10][arr.length];//定义桶
int[] elementCount = new int[10];//定义桶的记录
//将数据放入桶内
for(int i = 0;i<arr.length;i++){
int element = arr[i] % 10;//计算出桶的数据的个位置
bucket[element][elementCount[element]] = arr[i];
elementCount[element]++; //数据加1
}
//取出数据
int index = 0;
for(int k =0;k<elementCount.length;k++){//遍历桶记录
if(elementCount[k] != 0){
for(int h = 0;h < elementCount[k];h++){//
arr[index] = bucket[k][h];
index++;
}
}
elementCount[k] = 0;//清空桶记录
}
}
数据又从新倒回桶当中,第二轮清空桶记录。
总体代码:
public class RedixSort {
public static void main(String[] args) {
int[] arr = {41, 31, 515, 74, 20, 10, 3, 13, 61, 50, 16, 69};
redixSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] args) {
//找到数组当中的最大值,并且确定排序次数
int max = arr[0];
for(int i = 0;i < arr.length;i++) {
if(arr[i]>max) {
max = arr[i];
}
}
int maxLength = (max + "").length();//最大值的位数
int[][] bucket = new int[10][arr.length];//定义桶
int[] elementCount = new int[10];//定义桶的记录
int a = 1;
for(int m = 0;m<maxLength;m++){
//将数据放入桶内
for(int i = 0;i<arr.length;i++){
int element = arr[i] %a % 10;//计算出桶的数据的个位置
bucket[element][elementCount[element]] = arr[i];
elementCount[element]++; //数据加1
}
//取出数据
int index = 0;
for(int k =0;k<elementCount.length;k++){//遍历桶记录
if(elementCount[k] != 0){
for(int h = 0;h < elementCount[k];h++){//
arr[index] = bucket[k][h];
index++;
}
}
elementCount[k] = 0;//清空桶记录
}
a = a * 10;
}
System.out.println(Arrays.toString(arr));
}
}
运行最后就排好序啦。