Java实现基数排序
2014-03-05 15:10
169 查看
在众多的排序方法中基数排序比较特殊,它是一种不需要进行关键字之间比较的排序方法,利用多关键字的划分,逐渐将待排序列排好序。
举个例子:
现在有数组:278,109,63,930,589,184,505,269,8,83
第一次根据各位数将数组划分为10个队列(当然其中的某些队列可能不含有元素)
0:930
1:
2:
3:63,83
4:184
5:505
6:
7:
8:278,8
9:109,589,269
然后收集成序列:
930,63,83,184,505,278,8,109,589,269
在进行第二次分组:
0:505,8,109
1:
2:
3:930
4:
5:
6:63,269
7:278
8:83,184,589
9:
第二次收集:
505,8,109,930,63,269,278,83,184,589
第三次分配:
0:8,63,83
1:109,184
2:278,269
3:
4:
5:505,589
6:
7:
8:
9:930
最后得到序列:
8,63,83,109,184,269,278,505,589,930
完成排序!
基数排序其实是利用多关键字先达到局部有序,再调整达到全局有序。
Java代码
public class RadixSort {
public int[] radixSort(int[] array){
//首先确定排序的趟数;
int max=array[0];
for(int i=1;i<array.length;i++){
if(array[i]>max){
max=array[i];
}
}
int time=0;
//判断位数;
while(max>0){
max/=10;
time++;
}
//建立10个队列;
Queue<Integer>[] queue=new Queue[10];
for(int i=0;i<10;i++){
queue[i]=new ArrayDeque<Integer>();
}
//进行time次分配和收集;
for(int i=0;i<time;i++){
//分配数组元素;
for(int j=0;j<array.length;j++){
//得到数字的第time+1位数;
queue[array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i)].offer(array[j]);
}
int count=0;//元素计数器;
//收集队列元素;
for(int k=0;k<10;k++){
while(queue[k].size()>0){
array[count]=(Integer) queue[k].poll();
count++;
}
}
}
return array;
}
public static void main(String []args){
int []arr={278,109,63,930,589,184,505,269,8,83};
RadixSort rs = new RadixSort();
int []array = rs.radixSort(arr);
for(int i = 0 ; i < array.length ; i ++){
System.out.println(arr[i]);
}
}
}
如果待排序列的关键字不是自然数,我们当然可以对其进行转化,然后利用类似的方式排序。
举个例子:
现在有数组:278,109,63,930,589,184,505,269,8,83
第一次根据各位数将数组划分为10个队列(当然其中的某些队列可能不含有元素)
0:930
1:
2:
3:63,83
4:184
5:505
6:
7:
8:278,8
9:109,589,269
然后收集成序列:
930,63,83,184,505,278,8,109,589,269
在进行第二次分组:
0:505,8,109
1:
2:
3:930
4:
5:
6:63,269
7:278
8:83,184,589
9:
第二次收集:
505,8,109,930,63,269,278,83,184,589
第三次分配:
0:8,63,83
1:109,184
2:278,269
3:
4:
5:505,589
6:
7:
8:
9:930
最后得到序列:
8,63,83,109,184,269,278,505,589,930
完成排序!
基数排序其实是利用多关键字先达到局部有序,再调整达到全局有序。
Java代码
public class RadixSort {
public int[] radixSort(int[] array){
//首先确定排序的趟数;
int max=array[0];
for(int i=1;i<array.length;i++){
if(array[i]>max){
max=array[i];
}
}
int time=0;
//判断位数;
while(max>0){
max/=10;
time++;
}
//建立10个队列;
Queue<Integer>[] queue=new Queue[10];
for(int i=0;i<10;i++){
queue[i]=new ArrayDeque<Integer>();
}
//进行time次分配和收集;
for(int i=0;i<time;i++){
//分配数组元素;
for(int j=0;j<array.length;j++){
//得到数字的第time+1位数;
queue[array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i)].offer(array[j]);
}
int count=0;//元素计数器;
//收集队列元素;
for(int k=0;k<10;k++){
while(queue[k].size()>0){
array[count]=(Integer) queue[k].poll();
count++;
}
}
}
return array;
}
public static void main(String []args){
int []arr={278,109,63,930,589,184,505,269,8,83};
RadixSort rs = new RadixSort();
int []array = rs.radixSort(arr);
for(int i = 0 ; i < array.length ; i ++){
System.out.println(arr[i]);
}
}
}
如果待排序列的关键字不是自然数,我们当然可以对其进行转化,然后利用类似的方式排序。
相关文章推荐
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
- 基数排序详解以及java实现
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 排序算法(三)_计数排序、基数排序的Java实现
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
- Java 实现基数排序,时间关系,暂未亲自敲代码实现,记一下。
- 基本排序算法——基数排序java实现
- Java实现基数排序
- Java实现基数排序(桶排序)
- 数据结构与算法——基数排序简单Java实现
- 数据结构算法之排序系列Java、C源码实现(8)--基数排序
- 基数排序-java实现
- Java实现基数排序
- 基数排序---JAVA实现
- 排序算法之——基数排序(Java实现)
- 排序算法Java实现(基数排序)
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
- 一种基数排序的Java实现