基数排序算法思想:
基数排序算法属于不基于比较的排序算法中的一种,要根据具体的数据状况来判断能否采用基数排序算法进行排序。
假设基数为10,待排序数组arr中有N个数,最大数字为arr[i],有3位数字,则要把数组中长度不到3位的数字左边补0,使其变为3位数字。准10个桶,编号为0-9十个数字:
(1)从左到右遍历数组,先根据数组arr的元素的个位数字,依次将数组元素放入对应编号的桶中(桶具有先入先出的特点),数组遍历完成之后,依次将编号0-9的桶中的数字倒出来,放入数组arr中;
(2)从左到右遍历数组,再根据数组arr的元素的十位数字,依次将数组元素放入对应编号的桶中(桶具有先入先出的特点),数组遍历完成之后,依次将编号0-9的桶中的数字倒出来,放入数组arr中;
(3)从左到右遍历数组,最后根据数组arr的元素的百位数字,依次将数组元素放入对应编号的桶中(桶具有先入先出的特点),数组遍历完成之后,依次将编号0-9的桶中的数字倒出来,放入数组arr中,至此,数组从小到大排序完成。
(1)、(2)和(3)三个步骤,哪个步骤越靠后,该位数字排序的优先级越高,也就是说,对于本例而言,排序的时候先考虑百位数字的顺序,再考虑十位数字的顺序,最后考虑个位数字的顺序,这也符合我们数学上排序的习惯。
计数排序代码:
public class RadixSort {
public void radixSort(int[] arr){
if(arr == null || arr.length < 2){
return;
}
int digit = getDigit(arr);//获取数组中最大元素的位数
final int radix = 10;//基数为10
int[] bucket = new int[arr.length];//辅助数组
for(int d = 1; d <= digit; d++){//d表示数组元素的从左到右第d位
int[] count = new int[radix];//桶,count数组长度就是基数
for(int i = 0;i < arr.length;i++){
int figure = getFigure(arr[i],d);//取出arr[i]第d位上的数字
count[figure]++;//计数桶,count[figure]表示第d位上为figure的数字有几个
}
for(int i = 1; i < count.length;i++){
count[i] += count[i - 1];//count[i]表示第d位上小于等于i的数字有几个
}
for(int i = arr.length - 1;i >= 0;i--){//count数组的特点,以及桶先入先出的特点,决定了数组此处要从右到左遍历
int figure = getFigure(arr[i],d);
bucket[--count[figure]] = arr[i];
}
for(int i = 0;i < arr.length;i++){
arr[i] = bucket[i];
}
}
}
public int getDigit(int[] arr){
int max = Integer.MIN_VALUE;
for(int i = 0;i < arr.length;i++){
max = Math.max(arr[i], max);
}
int digit = 0;
while(max != 0){
digit++;
max /= 10;
}
return digit;
}
public int getFigure(int num,int d){
return (num / (int)(Math.pow(10,d - 1)) % 10);
}
本文介绍了基数排序算法的工作原理,这是一种非比较型排序算法。通过设置10个桶进行数字分配,按照从低位到高位的顺序依次进行排序。首先处理个位,然后十位,最后百位,确保最终数组有序。提供的Java代码示例展示了如何实现基数排序,包括获取数字位数、计数排序等关键步骤。
166

被折叠的 条评论
为什么被折叠?



