您的位置:首页 > 编程语言 > Java开发

基数排序

2017-05-14 15:21 288 查看
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂为O
(nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法


第一步

以LSD为例,假设原来有一串数值如下所示:

73, 22, 93, 43, 55, 14, 28, 65, 39, 81

首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:

0

1 81

2 22

3 73 93 43

4 14

5 55 65

6

7

8 28

9 39


第二步

接下来将这些桶子中的数值重新串接起来,成为以下的数列:

81, 22, 73, 93, 43, 14, 55, 65, 28, 39

接着再进行一次分配,这次是根据十位数来分配:

0

1 14

2 22 28

3 39

4 43

5 55

6 65

7 73

8 81

9 93


第三步

接下来将这些桶子中的数值重新串接起来,成为以下的数列:

14, 22, 28, 39, 43, 55, 65, 73, 81, 93

这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。

LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。

java代码实现
import java.util.Scanner;

public class 基数排序 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
int number[]=new int[1000];
int n=scan.nextInt();
for(int i=0;i<n;i++){
int a=scan.nextInt();
number[i]=a;
}

//求出最大位数多少位
int deep=MaxDeep(number);

sort(number,deep,n);
for(int i=0;i<n;i++){
System.out.print(number[i]+" ");
}
System.out.println();
}

private static int MaxDeep(int[] number) {
// TODO Auto-generated method stub
int max=-1;
for(int i=0;i<number.length;i++){
if(max<number[i]){
max=number[i];
}
}
String str=String.valueOf(max);
return str.length();
}

private static void sort(int[] number, int d,int length) {
// TODO Auto-generated method stub
int k=0;
int n=1;
int m=1;//控制键值排序依据在哪一位
//数组的一维表示可能的余数0-9
int [][]temp=new int[10][number.length];
//数组order[i]表示该位是i的数
int []order=new int[10];
while(m<=d){
for(int i=0;i<length;i++){
int lsd=((number[i]/n)%10);
temp[lsd][order[lsd]] = number[i];
order[lsd]++;
}
for(int i=0;i<10;i++){
if(order[i]!=0){
for(int j=0;j<order[i];j++){
number[k] = temp[i][j];
k++;
}
}
order[i] = 0;
}
n *= 10;
k = 0;
m++;
}
}

}
测试数据

10

73 22 93 43 55 14 28 65 39 81

       14 22 28 39 43 55 65 73 81 93 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息