【问题标题】:Using a Sort algorithm to sort a list of strings使用排序算法对字符串列表进行排序
【发布时间】:2013-04-07 10:06:52
【问题描述】:

我想知道是否有人可以告诉我如何使用排序算法按字母顺序对字符串列表进行排序?

我知道我可以简单地使用List<string>.Sort(),但是如果了解如何将其编写为字符串排序算法,那就太好了。

目前,我已经了解如何在整数值附带排序算法时实现排序算法,但在处理列表中的字符串时我很挣扎。

    // sort a vector of type int using exchange sort
    public void ExchangeSort(int[] array)
    {
        int pass, i, n = array.Length;
        int temp;
        // make n-1 passes through the data 
        for (pass = 0; pass < n - 1; pass++)
        {
            // locate least of array[pass] ... array[n - 1]  
            // at array[pass] 
            for (i = pass + 1; i < n; i++)
            {
                if (array[i] < array[pass])
                {
                    temp = array[pass];
                    array[pass] = array[i];
                    array[i] = temp;
                }
            }
        }
    }

【问题讨论】:

  • 不是一个确切的答案,但您可以查看sorting-algorithms.com
  • 对于排序有一个比较操作和一个交换操作(移动)。因此,对于字母字符串,比较操作会发生变化。

标签: c# string algorithm list sorting


【解决方案1】:

您可以像您的 int 排序器一样执行此操作,但不是

if (array[i] < array[pass])

你会使用

var comp = StringComparer.InvariantCultureIgnoreCase;
....
if (comp.Compare(array[i],array[pass]) < 0)

微软提供的standard string comparers有几种,比如使用当前文化、不变文化、忽略大小写等等。

如果你想编写自己的比较函数,最简单的方法是在 for 循环中遍历两个字符串,然后将每个字符相互比较。但是,除非严格用于学习目的,否则我不建议这样做,因为让您自己的比较在 unicode 和不同语言的所有极端情况下都能正常工作非常困难。

【讨论】:

    【解决方案2】:

    字符串的比较可以通过 string.Compare 函数来完成。要手动执行此操作,可能会变得相当复杂,因为有许多不同的选项。

    一种可能性是只比较 ascii 值,像这样

    bool isLarger(string s1, string s2)
    { 
    return Enumerable.Range(0, Math.Min(s1.Length, s2.Length)).SkipWhile(i => s1[i] == s2[i]).Select(i => s1[i] > s2[i]).FirstOrDefault();
    }
    

    为了更好的比较,这里有很多选项,如下所述:http://msdn.microsoft.com/en-us/library/system.globalization.compareinfo(v=vs.80).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多