对由小数点分隔的可变长度整数列表进行排序

时间:2010-04-08 19:51:19

标签: algorithm sorting

我需要一些帮助。

我有一个需要排序的分隔整数值列表。一个例子:

典型(alpha?)排序:

1.1.32.22

11.2.4

2.1.3.4

2.11.23.1.2

2.3.7

3.12.3.5

正确(数字)排序:

1.1.32.22

2.1.3.4

2.3.7

2.11.23.1.2

3.12.3.5

11.2.4

我无法弄清楚如何设置算法以使用 n 数量的十进制分隔符和 m 整数字段数进行排序。

有什么想法吗?这必须在以前完成。如果您需要更多信息,请与我们联系。

非常感谢! -Daniel

5 个答案:

答案 0 :(得分:3)

您真正需要做的就是编写“compare()”,然后将其插入任何排序算法。

要编写比较,从左到右比较每个字段,如果任何字段更高,则返回该参数更高。如果一个参数较短,则假设其余字段为0。

答案 1 :(得分:1)

versionsort完全符合您的要求。

比较算法是strverscmp,这里是手册页中对它的描述:

  

这个功能的作用是什么   以下。如果两个字符串相等,   返回0.否则找到位置   两个字节之间的属性   在它们两个字符串相等之前,   在它之后直接有一个   区别。找到最大的   连续数字字符串包含   (或从此开始,或以此结束)   位置。如果其中一个或两个是   空,然后返回strcmp()会   已经返回(数字排序)   字节值)。否则,比较两者   数字字符串数字,数字   带有一个或多个前导的字符串   零被解释为具有它们   前面的小数点(所以在   特定数字字符串更多   前导零点在数字之前   前导零较少的字符串)。   因此,订购是000,00,01,   010,09,0,1,9,10。

答案 2 :(得分:1)

查看radix sort

答案 3 :(得分:0)

它被称为自然排序。见Natural Sorting algorithm。 例如,Python中的Darius Bacon's answer

def sorted_nicely(strings): 
    "Sort strings the way humans are said to expect."
    return sorted(strings, key=natural_sort_key)

def natural_sort_key(key):
    import re
    return [int(t) if t.isdigit() else t for t in re.split(r'(\d+)', key)]

答案 4 :(得分:-1)

一般解决方案是将此字符串转换为字节数组,然后使用qsort并指定比较函数。