String 对只有两个不同字符的字符串进行排序的最有效方法是什么?

String 对只有两个不同字符的字符串进行排序的最有效方法是什么?,string,sorting,String,Sorting,如果我知道字符串不超过2个不同字符 示例集: aab abbbbabb bbbaa aaaaaaa aaaa abab a aa aaaaa aaabba aabbbab 按字母顺序排列最有效的方法是什么 生成的排序集: a aa aaaa aaaaa aaaaaaa aaabba aab aabbbab abab abbbbabb bbbaa 编辑: 我知道我可以使用一个普通的排序算法(快速排序、合并排序),但问题是:不超过2个不同字符的事实是否会使其他排序更有效 如果字符串的最大长度很重

如果我知道字符串不超过2个不同字符

示例集:

aab
abbbbabb
bbbaa
aaaaaaa
aaaa
abab
a
aa
aaaaa
aaabba
aabbbab
按字母顺序排列最有效的方法是什么

生成的排序集:

a
aa
aaaa
aaaaa
aaaaaaa
aaabba
aab
aabbbab
abab
abbbbabb
bbbaa
编辑:

我知道我可以使用一个普通的排序算法(快速排序、合并排序),但问题是:不超过2个不同字符的事实是否会使其他排序更有效

如果字符串的最大长度很重要,我想知道两种不同情况的答案:

  • 字符串的最大长度与字符串数相同(n个正在排序的字符串,n个字符串的最大长度)

  • 字符串的最大长度为log n,其中n为正在排序的字符串数


  • 我还可以假设所有字符串都是不同的。

    该字符串或方法将返回一个负整数、0或一个正整数,具体取决于所比较的两个字符串的字母顺序。试试看。

    仅基于渐进比较的常规排序算法无法获得比
    O(nlogn)
    更好的结果。在您的案例中,有一个额外的信息(2个不同的字符)有可能改善这个结果。产生
    O(n)
    结果的简单方法:

  • 检查第一个字符(让我们将其标记为
    x
  • 扫描字符串直到结束
    • 每当遇到
      x
      时,增加一个计数器
    • 第一次遇到非x字符时(让我们将其标记为
      y
      ),请将其存储在专用变量中
  • 比较
    x
    y
    。 如果
    x
    根据计数器从开头用
    x
    填充字符串,其余用
    y
    如果
    x>y
    从一开始用
    y
    字符串长度x
    的插槽数填充字符串,其余用
    x
    填充字符串

  • 哪种语言?您尝试过什么?字符串的最大长度是多少?@rcgldr好问题-问题中添加的信息您可以将字符串转换为二进制位,0代表a,1代表b,但您必须以位数跟踪字符串长度。使用基数4(每个字符2位),0=无字符,1='a',2='b',3=未使用,但使所有字符串长度相同,左对齐。如果字符串长度不太长,可以使用计数/基数排序。这看起来像是对字符串中的字符进行排序。我的意思是对字符串集进行排序。(我认识到我的例子可能使这一点不清楚,所以我对其进行了编辑。)