基数排序的说明:
1)
基数排序是对传统桶排序的扩展,速度很快
.
2)
基数排序是经典的空间换时间的方式,占用内存很大
,
当对海量数据排序时,容易造成
OutOfMemoryError
。
3)
基数排序时稳定的。
[
注
:
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,
r[
i
]=r[j]
,且
r[
i
]
在
r[j]
之前,而在排序后的序列中,
r[
i
]
仍在
r[j]
之前,
则称这种排序算法是稳定的;否则称为不稳定的
]
基数排序基本思想
1)
将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后
,
数列就变成一个有序序列。
●
2)
这样说明,比较难理解,下面我们看一个图文解释,理解基数排序的步骤
基数排序代码实现
public static void radixSort(int[] arr){
/**
*num控制位数
*/
int max=arr[0];
for (int i=1;i< arr.length;i++)
{
if (arr[i]>max)
{
max=arr[i];
}
}
int maxR = (max+"").length();//求出最高位数
int[][] bucket = new int[10][arr.length]; //10个桶子
int[] bucketElementCounts = new int[10];//记录10个桶子里的数
int num;
int index;
for (int i=0,n=1;i<maxR;i++,n*=10)
{
for (int j=0;j< arr.length;j++)
{
num = arr[j]/n%10;
bucket[num][bucketElementCounts[num]]=arr[j];
bucketElementCounts[num]++;
}
index=0;
for (int k =0;k< bucketElementCounts.length;k++)
{
if (bucketElementCounts[k]!=0)
{
for (int z=0;z<bucketElementCounts[k];z++){
arr[index++]=bucket[k][z];
}
}
bucketElementCounts[k]=0;
}
}
}
int[] arrr = new int[8000000];
for (int i=0;i<8000000;i++)
{
arrr[i]=(int)(Math.random()*8000000);
}
Date date1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr1 = simpleDateFormat.format(date1);
System.out.println("基数排序前"+dateStr1);
radixSort(arrr);
Date date2= new Date();
String dateStr2 =simpleDateFormat.format(date2);
System.out.println("基数排序后"+dateStr2);
代码测试800w数据1秒运行完毕