桶排序解决字符串排序问题
程序员文章站
2022-03-03 08:24:05
...
本文利用桶排序解决字符串排序
1.问题约束
- 这里说的字符串指的是标准ASCII字符组成的字符串序列(7位,共计256个)
- 这里先试用LCD方法,也就是低位优先
2.思路:
相当于使用桶排序,这里的桶指的是256个字符,统计每个字符出现的个数,相应的桶增加,桶本身是有顺序的,按照桶的顺序,取出相应桶对应的字符所在的字符串进行排列,排列的过程是根据频率统计的时候获取的字符个数,这时候桶里面的个数就是这个桶里的第一个元素距离数组最开始位置的相对距离,递增这个数可以把桶里面的元素全部排列好。这样是一次排序,把所有的字符都排序一遍,就能完成对整个字符串数组的排序。是稳定的排序。
3.代码
/**
* Created by kisstheraik on 16/8/24.
* Description 字符串排序,地位优先
*/
public class LSDSort {
public static void main(String[] args){
String[] list={"1wsde","1eyuh","3dfgt","3oiu5","#jdij"};
LSD(list,5);
for (String a:
list) {
System.out.print(a+" ");
}
}
//实际上就是桶排序,这里count数组装了相应的桶里面的元素个数,然后可以算出,每个桶里面到最小的那个桶里面的个数,这个个数就是相应的数据的下标
/**
*
* @param list String[] 需要排序的字符串
* @param w int 需要排序的字符串长度,从前向后数
*/
public static void LSD(String[] list,int w){
//低位优先的代码实践
int ANUM=256;//字母表的个数
int length=list.length;
String [] tmp=new String[length];
for(int i=w-1;i>=0;i--){
int [] count=new int[ANUM+1];
for(int j=0;j<length;j++)
count[list[j].charAt(i)+1]++;
for(int j=0;j<ANUM;j++)
count[j+1]+=count[j];
//这里每个桶的开始位置被存在了桶里,通过++来移动这个桶里的元素的相对位置
for(int j=0;j<length;j++)
tmp[count[list[j].charAt(i)]++]=list[j];
for(int j=0;j<length;j++)
list[j]=tmp[j];
}
}
}
转载于:https://my.oschina.net/lovezfy/blog/737424