为什么某些排序方法按1、10、2、3…排序?


30

我注意到,有很多数字排序方法似乎按1、10、2、3 ...排序,而不是预期的1、2、3、10...。需要第一种方法,并且作为用户,只要在实践中看到它,我都会感到沮丧。第一种样式是否有合理的用例?如果是这样,它们是什么?如果没有,那么第一类样式是如何形成的?每种排序方法的正式名称是什么?


不是您问题的答案,但是,如果您必须对可能包含数字的字符串列表进行排序,则可能要使用Alphanum算法:davekoelle.com/alphanum.html
TehShrike 2012年

非常非常简单。排序时,算法从左到右扫描。因此,当涉及到1和5时,5会更大,如果1实际上是较大的数字(如134234)的一部分,那么即使这个偶数也会变得愚蠢。要知道134234大于5,我们必须实际扫描越过数字到最后一位数字(实际上是第一位数字)4,然后向后工作,然后看到该数字实际上是一个100000,比5大得多。因此,您的典型盲目排序不会这样做,因为它只是将字符与忽略比较之后(或之前)发生的字符。
AbstractDissonance

1
如果您阅读en.wikipedia.org/wiki/Natural_sort_order,它应该很有意义。按照自然顺序,数字字符串被分组为单个“字符”。从物理上讲,不是从逻辑上讲,因此我们仍然可以像第一种情况那样进行字符比较,但是我们将能够比较整数字符串与整数字符串,而不是字符与字符,这将使我们能够比较完整值。各种排序都应该是这种方式,因为这是我们人类阅读事物的方式(对于数字,我们实际上是从右到左阅读,即使是从左到右的字符串1234 = 1000 + 200 + 30 + 4,而不是4000 + 300 + 20 + 1
AbstractDissonance

Answers:


62

即按字典顺序排序,这意味着该语言基本上将变量视为字符串,并逐个字符地进行比较("200"大于,"19999"因为'2'大于'1'

要解决这个问题,你可以

  • 确保将值视为整数,

  • 前缀'0'在字符串上,因此长度都相等(仅在知道最大值时才可行)。
    这就是为什么您会在媒体文件(S1E01)上看到前加0的剧集编号的原因,因此按字典顺序排序不会使事情变得混乱,并允许程序按字母顺序简单地播放/显示,

  • 或制作一个自定义比较器,该比较器首先比较字符串的长度(较短的字符串是较小的整数),然后在比较时按字典顺序比较(注意前导'0'


5
+1为“书法”。从未听说过该术语,我只是将其视为字母排序-如您所说,数字被视为字符串类型。
匿名

3
+1表示在字符串前面加上“ 0”。我不是在编写程序,而是以我的文件夹的名称进行编程的,而“第10章”在“第2章”之前。然后,我编写了称为01-09的第1-9章,现在对其进行了“正确”排序。
马文

6

按字母顺序,1自带2.每当你看到的第一个方法之前,它不是因为它是可取的,但因为排序是严格按字母顺序排列(偏偏左到右,一次一个字符):1,2,10个有道理而不是只知道字母比较的计算机。有没有办法在那种简单的比较就知道,一个一个接着一个0实际上来自两。

当您看到正确处理数字的单词和数字混合排序时,这是因为排序更智能,而且最重要的是,该排序通常通常只在字符串的开头或结尾起作用。


4

这是按字母顺序而不是数字顺序对数字字符串进行排序时的结果。

sort例如,该排序样式是unix 命令的默认行为,除非您使用--numeric-sort命令行选项,该选项告诉它尝试解释数字值。


4

其他人则回答了这种问题,但没人能真正回答关于您为什么看到它的问题。答案并不是那么令人兴奋。通常是一个错误。大多数排序方法将默认使用其中一种,而编程可能会在排序数字时粗心更改默认设置。


在混合字母/数字环境中,有经验的用户会倾向于喜欢 lexiographic排序,因为它是一贯的和可预测的。每个尝试“智能地”混合逻辑排序和数字排序的应用程序都稍有不同,这使实用程序产生了问题。
j__m
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.