提高字符串数组的自定义排序性能

cak*_*ake 3 c# arrays sorting algorithm performance

我试图找到一种有效的方法来根据数组的每个字符串元素中的数值对字符串数组进行排序.我目前正在使用Array.Sort(array,customComparer)静态方法(快速排序),我的自定义比较器类(按降序排序)是:

class StringComparer : IComparer<string>
{
    public int Compare(string a, string b)
    {
        string s1 = a;
        string s2 = b;

        Match matchA = Regex.Match(s1, @"\d+$");
        Match matchB = Regex.Match(s2, @"\d+$");

        long numberA = long.Parse(matchA.Value);
        long numberB = long.Parse(matchB.Value);

        if (numberB - numberA < 0)
        {
            return -1;
        }
        else 
        {
            return 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法非常有效,但有时需要花费太多时间进行排序,在一台2.4Ghz处理器上使用超过一分钟的10万个字符串数组.我想知道是否有更有效的方法来实现同样的目标.例如,实现不同的排序算法或采用另一种方法,例如使用字典并对值进行排序(值是字符串的数字部分).有什么建议?提前致谢!

Jon*_*eet 5

您正在解析每个比较的值.我建议你解析一次,得到一个字符串/长对,排序,然后提取字符串部分.

请注意,您现有的代码有一个错误:它永远不会返回0,因为两个字符串比较相等.

这是使用LINQ的替代方法(不是就地排序,但很简单.)

var sorted = unsorted.OrderBy(x => long.Parse(Regex.Match(x, @"\d+$").Value));
                     .ToList();
Run Code Online (Sandbox Code Playgroud)

(OrderBy项目一次获取密钥,然后比较密钥.)