基数排序
一、介绍
1、概念
基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
2、基本思想
从低位关键码起,按关键码的不同值将序列中的记录“分配”到RADIX个队列(组)中,然后再“收集”,称之为一趟排序,第一趟之后,排序表中的记录已按最低位关键码有序,再次对最低位关键码进行一趟“分配”和“收集”如此直到对最高位关键码进行一趟“分配”和“收集”,则排序表按关键字有序。
比如:对278、109、63、930、589、184、505、269、8、83进行排序
①因为是对10进制整数进行排序,为了方便我们以10为基数进行排序
②为了让位数保持一致,先将位数不够的在高位进行补零操作,变成以下数字:278、109、063、930、589、184、505、269、008、083。
③先按照个位数字进行分组,共有9组(0~9),结果如下
0:930
1:
2:
3:063、083
4:184
5:505
6:
7:
8:278、008
9:109、589、269
将分组后的数据按顺序进行收集:
930、063、083、184、505、278、008、109、589、269
④对上面收集后的数据按照十位进行分组,结果如下:
0:505、008、109
1:
2:
3:930
4:
5:
6:063、269
7:278
8:083、184、589
9:
将分组后的数据按顺序进行收集:
505、008、109、930、063、269、278、083、184、589
⑤对上面收集后的数据按照百位进行分组,结果如下:
0:008、063、083
1:109、184
2:269、278
3:
4:
5:505、589
6:
7:
8:
9:930
将分组后的数据按顺序进行收集:
008、063、083、109、184、269、278、505、589、930
到此我们已经得到了有序的数据序列
二、算法实现
/**
* 基数排序
* @param elements 待排序数组
* @param radix 基数
* @param bitNum 数据的位数
*/
public static void RadixSort(MyElement[] elements, int radix, int bitNum){
int n = 1;
//初始化头指针数组
MyElementIndex[] heads = new MyElementIndex[radix];
for (int i = 0; i < heads.length; i++) {
heads[i] = new MyElementIndex();
}
for(int i=0; i<bitNum; i++){
//将数据按照关键字进行分组
for(int j=0; j<elements.length; j++){
int k = elements[j].num/n%10;
if (heads[k].head == null) {
heads[k].head = elements[j];
}else{
heads[k].tail.next = elements[j];
}
heads[k].tail = elements[j];
heads[k].tail.next = null;
}
//将分组后的数据重新收集
int k = 0;
for(int j=0; j<heads.length; j++){
while (heads[j].head != null) {
elements[k++] = heads[j].head;
heads[j].head = heads[j].head.next;
}
}
System.out.println("第"+(i+1)+"趟:");
for (int j = 0; j < elements.length; j++) {
System.out.print(elements[j].num+" ");
}
System.out.println();
n *= 10;
}
}
三、运行结果
四、性能分析
稳定性:稳定
时间复杂度:分配一趟时间复杂度为O(n),收集一趟时间复杂度为O(RADIX),关键码为bitNum位,共需要bitNum趟,所以时间复杂度为O(bitNum*(n+RADIX))