基数排序算法

来源:互联网 发布:雷电网络 价格 编辑:程序博客网 时间:2024/06/05 21:52
package com.suanfa;


public class RadixSort {
private static String[] month = {"J", "F", "M", "A", "Y", "L", "U", "G", "S", "O", "N", "D"};
private static String[] day = {"F", "S", "T", "O", "I", "M", "E", "G", "N"};
public static void main(String[] args)
{
   String[] A = {"DN", "FS", "OI", "SO", "YN", "MN", "JS", "FG", "SM", "OF", "NN", "DO"};
//                   JS, FS, FG, MN, YN, SO, SM, OF, OI, NN, DO, DN
   cu(A);
   for(String str:A)
   {
       System.out.print(str + ", ");
   }
   
}
private static int getIndex(String[] array, String chart)
{
int index = -1;
for(int i = 0; i < 12; i++)
{
if(chart.equals(array[i]))
{
index = i;
break;
}
}

return index;
}

private static void cu(String[] datas)
{
int length=datas.length;
int[] order=new int[length];//用于保存每个桶里有多少个数字
int k = 0;
for(int i = 0; i < 2; i++)
{
String[][] bucket=new String[12][length];//排序桶用于保存每次排序后的结果,这一位上排序结果相同的数字放在同一个桶里
for(String data : datas)
{
int digit = -1;
if(i == 1)
{
digit = getIndex(month, data.charAt(0) + "");
}
else if(i == 0)
{
digit = getIndex(day, data.charAt(1) + "");
}
bucket[digit][order[digit]] = data;
order[digit]++;
}

for(int n=0;n<length;n++)//将前一个循环生成的桶里的数据覆盖到原数组中用于保存这一位的排序结果
       {
           if(order[n]!=0)//这个桶里有数据,从上到下遍历这个桶并将数据保存到原数组中
           {
               for(int j=0;j<order[n];j++)
               {
                   datas[k]=bucket[n][j];
                   k++;
               }
           }
           order[n]=0;//将桶里计数器置0,用于下一次位排序
       }
k = 0;
}
}

}
原创粉丝点击