我想要做的是对文本标识符列表进行排序(例如,考虑文件名)。我正在寻找的排序算法是一种字母排序,但考虑到了组。
例如,将“D1”排序为“D21”应为:
D1,D2,D3,...,D21
而不是:
D1,D10,D11,D12,...... D2,D20,D21,D3,......
我已经花了很多时间尝试完成这种排序方式,但仍然无法找到如何做到这一点。团队越大,看起来就越难。
有没有人可以指导我或者用任何语言给我一些伪代码或代码?
感谢。
答案 0 :(得分:3)
答案 1 :(得分:2)
Jeff有一个post on this,其中包含多个实现的链接。它似乎被称为“自然分类”。
答案 2 :(得分:1)
Unix排序实用程序有一个'数字排序'选项-n可以按照你想要的方式排序,而不是普通的字典排序。
可能会查找有关'数字排序'的信息
sort 的Unix源代码将可用,但可能难以理解。
答案 3 :(得分:1)
PHP:nat*sort
系列函数(natsort
,natcasesort
,...)
的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功能。对象比较。首先,您可以直接比较整数和字符串(整数排序为小于任何字符串)。其次,您可以比较异构列表(它从开头比较元素,直到找到差异)。