基数排序
思想
- 通过按照键值的各个位的值,把要排序的元素分配到某些桶中,最终实现排序的效果。
- 将所有待比较的数值统一为同样的数位长度,数位较短的数的前面补充零。
- 从低位开始依次进行排序,这样从最低位排序到最高位排序完成之后,整个序列就变成了一个有序的序列。
示意图
特点
- 稳定性排序
- 基数排序是桶排序的扩展
- 基数排序的时间复杂度为O (nlog(r)m)
代码
package sort;
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a= {53,3,542,748,14,214};
System.out.println(Arrays.toString(a));
radixSort(a);
System.out.println(Arrays.toString(a));
}
//基数排序
public static void radixSort(int[] a){
//得到数组中最大数的位数
int max=a[0];
for(int i=1;i<a.length;i++)
{
if(a[i]>max)
{
max=a[i];
}
}
//得到最大的位数
int maxLength=(max+"").length();
int[][] bucket=new int[10][a.length];//创建桶
int [] bucketElementCounts=new int[10];//记录每一个桶中元素的个数
int n=1;
for(int i=0;i<maxLength;i++,n*=10)//多少位进行多少轮
{
for(int j=0;j<a.length;j++)
{
int digitOfElement=a[j]/n%10;//求对应个位、百位、千位
bucket[digitOfElement][bucketElementCounts[digitOfElement]]=a[j];//放入桶中
bucketElementCounts[digitOfElement]++;//对应桶中元素增加
}
//按照这个桶的顺序
int index=0;
//遍历每一个桶,并把桶中的数据放到原来的数组
for(int k=0;k<bucketElementCounts.length;k++)
{
if(bucketElementCounts[k]!=0)//桶中有数据
{
for(int l=0;l<bucketElementCounts[k];l++)//把桶中数据放回原来的数组
{
a[index++]=bucket[k][l];
}
}
//放完了桶中的数据之后,桶中的数据就为空
bucketElementCounts[k]=0;
}
}
}
}