使用计数排序进行名称排序

时间:2011-09-27 06:19:00

标签: string sorting counting-sort

我无法使用计数排序按字母顺序对名称进行排序,例如我假设按字母顺序排序并添加了数字输入,例如0001 Alex Smith, Gregory John, Alex Smith, Adam Richard, Alex Ryan。输出应按此顺序排列:

亚当理查德
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;   
   }
}
}

2 个答案:

答案 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]]

计数排序

  1. 创建n维的计数数组 其中n =最长字符串的长度(在这种情况下为2),并且 每个维度中的列数=“转换后的数据”中的最大值(在这种情况下为4)+1(为“ *”添加)。 因此,创建了一个5x5的计数数组。

例如-如果字符串的最长长度为5,最高字符为“ f”,则将创建7x7x7x7x7的数组。

与普通计数数组一样,存储基于“转换后的数据”的值。例如,对于[1,0],存储的值为2。 计数数组

  1. 从[0,0]一直到[4,4]累积此n维数组。

  2. 现在类似地,将“转换后的数据”与计数数组一起使用来确定每个字符串在排序数组中的位置。对于前。 — [1,0](a *)位置是2。 并且类似地,在确定位置之后,从计数数组中的该值减去1。因此,Count数组中[1,0]处的值变为1。类似,[2,4](bd)在排序数组中的位置为5。

https://playcode.io/475393

答案 1 :(得分:0)

计算排序是此问题的错误排序算法。计数排序算法用于对固定范围内的整数值进行排序,因此无法应用于排序字符串。

另一方面,你可以使用基数排序来解决这个问题。基数排序的工作原理是一次对输入的一个数字或字符进行排序,它非常适合排序字符串。基数排序有两种基本类型 - 最重要数字基数排序和最低有效数字基数排序。基数排序的MSD风格并不像计数排序那样让人联想到,但是LSD基数排序的工作方式是一次使用一个字符排序。如果你真的必须使用计数排序,我建议你考虑调查LSD基数排序。