我无法使用计数排序按字母顺序对名称进行排序,例如我假设按字母顺序排序并添加了数字输入,例如0001 Alex Smith, Gregory John, Alex Smith, Adam Richard, Alex Ryan
。输出应按此顺序排列:
到目前为止我的代码:
public class Names
{
//private static int[] c;
public ArrayList<String> getUserInput()
{
ArrayList<String> names = new ArrayList<String>();
Scanner in = new Scanner(System.in);
while (in.hasNext())
{
names.add(in.next());
System.out.println(names);
}
in.close();
return names;
}
private static CountingSort(int A[], int B[], int k[])
{
int i;
int C[0];
for(i = 0; i <= k; i++){
C[i]=0;
}
for(int j=1; j <= A.length; ){
C[A[j]] = C[A[j]] + 1;
}//C[i] now contains numbers of elements equals to i
for(int i=1; i < k; i++){
C[i] = C[i] + C[i - 1];
}
for(int j = A.length; j--){
B[C[A[j]]] = A[j];
C[A[j]] = C[A[j]] - 1;
}
}
}
答案 0 :(得分:1)
准备数据
a。使每个字符串的长度相等。在每个字符串的末尾添加“ *”,以使所有长度相等。
Modified Data — [‘a*’, ‘bd’, ‘cd’, ‘ab’, ‘bb’, ‘a*’, ‘cb’]
b。通过将位置值分配给字母,将此修改后的数据字符串转换为数字。 a-z到1–26,*到0。所以这变成了二维数组。
Converted Data — [[1,0],[2,4],[3,4],[1,2],[2,2],[1,0],[3,2]]
计数排序
例如-如果字符串的最长长度为5,最高字符为“ f”,则将创建7x7x7x7x7的数组。
与普通计数数组一样,存储基于“转换后的数据”的值。例如,对于[1,0],存储的值为2。 计数数组
从[0,0]一直到[4,4]累积此n维数组。
现在类似地,将“转换后的数据”与计数数组一起使用来确定每个字符串在排序数组中的位置。对于前。 — [1,0](a *)位置是2。 并且类似地,在确定位置之后,从计数数组中的该值减去1。因此,Count数组中[1,0]处的值变为1。类似,[2,4](bd)在排序数组中的位置为5。
答案 1 :(得分:0)
计算排序是此问题的错误排序算法。计数排序算法用于对固定范围内的整数值进行排序,因此无法应用于排序字符串。
另一方面,你可以使用基数排序来解决这个问题。基数排序的工作原理是一次对输入的一个数字或字符进行排序,它非常适合排序字符串。基数排序有两种基本类型 - 最重要数字基数排序和最低有效数字基数排序。基数排序的MSD风格并不像计数排序那样让人联想到,但是LSD基数排序的工作方式是一次使用一个字符排序。如果你真的必须使用计数排序,我建议你考虑调查LSD基数排序。