如何按字母顺序排序,但尊重组或符号?

时间:2009-09-09 00:19:54

标签: algorithm sorting

我想要做的是对文本标识符列表进行排序(例如,考虑文件名)。我正在寻找的排序算法是一种字母排序,但考虑到了组。

例如,将“D1”排序为“D21”应为:

D1,D2,D3,...,D21

而不是:

D1,D10,D11,D12,...... D2,D20,D21,D3,......

我已经花了很多时间尝试完成这种排序方式,但仍然无法找到如何做到这一点。团队越大,看起来就越难。

有没有人可以指导我或者用任何语言给我一些伪代码或代码?

感谢。

5 个答案:

答案 0 :(得分:3)

  • 首先检测字符串的位置。
  • 如果该位置的两个值都是数字:
    • 向前读,一个字符,直到你在任一字符串中找到一个非数字。
    • 如果只有一个字符串是非数字字符串,则为“较小”字符串
    • 如果两个字符串在同一点都是非数字字符串,则比较较早检测到的位置的数字
  • 否则
    • 按字母顺序比较位置上的字母

答案 1 :(得分:2)

Jeff有一个post on this,其中包含多个实现的链接。它似乎被称为“自然分类”。

另见this question

答案 2 :(得分:1)

Unix排序实用程序有一个'数字排序'选项-n可以按照你想要的方式排序,而不是普通的字典排序。

可能会查找有关'数字排序'的信息

sort 的Unix源代码将可用,但可能难以理解。

答案 3 :(得分:1)

PHP:nat*sort系列函数(natsortnatcasesort,...)

的Perl:

sub natcmp {
    # from http://www.perlmonks.org/?node_id=540890
    my @a = split /(\d+)/, (shift or $a);
    my @b = split /(\d+)/, (shift or $b);

    my $last = min(scalar @a, scalar @b)-1;
    my $cmp;
    for my $i (0 .. $last) {
        unless($i & 1) {  # even
            $cmp = lc $a[$i] cmp lc $b[$i] || $a[$i] cmp $b[$i] and return $cmp;
        } else {  # odd
            $cmp = $a[$i] <=> $b[$i] and return $cmp;
        }
    }
    return scalar @a <=> scalar @b;  # shortest array comes first
}

# ...

@sorted_array = sort natcmp @array;

您正在寻找的是自然分类

答案 4 :(得分:1)

其他人指出它被称为“自然排序”。对于代码,this Python implementation是我发现的最简单的代码。它基本上使用正则表达式将每个字符串拆分为异构的整数或字符串列表,然后进行比较。

这利用了w.r.t的几个Python功能。对象比较。首先,您可以直接比较整数和字符串(整数排序为小于任何字符串)。其次,您可以比较异构列表(它从开头比较元素,直到找到差异)。