【code基础】基数排序java实现
思路
总体思想如下:
- 从个位开始从小到大排列
- 从十位开始从小到大有序排列
- 以此类推
- 直到最高位排列完毕,即得到整个数组的排序完毕
代码实现
思路整理:
- 获得数组的最高位
- 求取第k位对应的元素,算法为arr[j]/a[i])%10,其中a[i]是个辅助变量{1,10,100,...},与最高位有关,简化循环用的
- 统计每个基数桶中相同的元素个数,使用count数组存取位置信息
- 将arr数组按照count数组的位置信息填充到bucket数组中
- 将bucket数组赋值到arr数组中
public void radixSort(){
int[] arr = {21,56,88,195,354,1,35,12,6,7};
int[] bucket = new int[arr.length]; //临时存储有序的数组
int[] count = new int[arr.length]; //计算数组位置的数组
int n = 3;
int[] a = {1,10,100};
for (int i = 0; i < n; i++) {
//1.初始清空count数组
for (int k = 0; k < arr.length; k++) {
count[k]=0;
}
//2.计算arr数据对应的基数个数,填充count数组
for (int j = 0; j < arr.length; j++) {
count[(arr[j]/a[i])%10]++;
}
//3.更新count数组,值表明对应的基数桶右边界的位置(右闭)
//开始计算位置,从0开始往后摞盘子,所以只顾看自己和前一个的位置即可
for (int k = 1; k < arr.length; k++) {
count[k] = count[k]+count[k-1];
}
//4. 把arr数据落入各个桶中,这里需要从后往前装
for (int k = arr.length-1; k >= 0; k--) {
int j = (arr[k]/a[i])%10;
bucket[count[j]-1] = arr[k];
count[j]--;
}
//5. 将桶中的数据取出来,赋值给arr
for (int k = 0; k < arr.length; k++) {
arr[k]=bucket[k];
}
}
for (int num : arr) {
System.out.println(num);
}
}