跳到主要内容
CalcMax

从小到大排序计算器

结果

-10, -3, 0, 4, 7, 12.5

排序结果(从小到大)

最小值
-10
最大值
12.5

把一组数从小到大排列,就是按它们在数轴上从左到右的位置摆好。7、−3、12.5、0、−10、4 这一串排出来是 −10、−3、0、4、7、12.5,而这条线的两头就是最小的值与最大的值。这一页对你贴进来的任何一串数做这件事,最多两百个,并给出排好的那一串、最小值与最大值。这是个小事,而它值得认真做,因为最容易想到的那种做法在两个地方是错的。第一处是数要按数值比,不能按文本比。把同一批值按字符串排会得到 −10、−3、0、12.5、4、7——它把 12.5 排到了 4 前面,因为字符 1 在字符 4 前面,而比较根本没有走到小数点后面那位。在一串个位正数上这个错误永远不出现,这正是它危险的地方:它会躲过每一个碰巧不含多位数或负数的测试,然后在线上、在一串恰好含了它们的数据上冒出来。第二处是负数,同一个坑在这里有一面镜子:按字符串比,−10 排在 −2 前面,看着是对的,而 −2 排在 −10 前面就是错的。正确的顺序是 −20 在 −10 前面、−10 在 −3 前面,因为在那条线上越靠左就越小,而不是越长就越小。还有两件这一页做了、但很容易被忽略的事。它保留重复项,所以 5、5、3 排出来是 3、5、5——去掉重复是另一件事,在这里做它就意味着答案里装的不再恰好是你给的那批数。以及它按规范形式印每个值,所以 12.50 变成 12.5、+7 变成 7,因为末尾的零与前导的加号不是值的一部分。如果你那样写是有意的,输出不会替你保留。把一串数排好,是人们想从一组数里得到的东西的第一步:中位数就是排序后的正中间,极差就是它的两头,而四分位数是按固定位置从它上面读出来的。

公式

7;−3;12.5;0;−10;4 ⇒ −10、−3、0、4、7、12.5;最小 = −10,最大 = 12.5

n
这一串数有几个——1 到 200 之间。1 是收的,给出只有一项的清单,而这是真的正确而不是退化情形:单个数字本来就是升序的,而且它同时是这组数里最小与最大的那个
a ≤ b
排序所依赖的那次比较,也是它正确性的全部。这是一次数值比较,所以 −10 ≤ −3 与 9 ≤ 10 都成立。按文本比则会把 −10 排在 −3 前面(碰巧对了),也会把 10 排在 9 前面(同一个碰巧错了),因为它从左往右逐字符比,比的是字符而不是值
−10, −3, 0, 4, 7, 12.5
排好的输出,同时也是输入的一个排列——六个值进去、六个值出来、还是那六个。这是你怀疑结果时该核对的那条不变量:个数要对得上,而且你放进去的每个值出现的次数要与放进去时一样。这一页不添加、不删除、也不合并任何数
最小 = −10
排好那一串的第一个元素,是从它上面取的,不是另扫一遍找出来的。在数轴上它是最左边那个点。它不等于输入里「看起来最小」的那一项:−10 看起来比 −3 短,而它是更小的数
最大 = 12.5
排好那一串的最后一个元素,同样是读出来的而不是搜出来的。它与最小值之间的差就是极差,那是唯一一个只要有这两个输出就够了的统计量——range-calculator 算的正是这一对
3, 5, 5
重复项会怎样。输入 5、5、3 排出来是 3、5、5——那个重复活着。去掉它看起来会更整洁,却会破坏上面那条不变量,而且会悄悄改掉任何关于「一共有几个值」的问题的答案,中位数就在其中

读中位数是排序最常见的理由:中位数是排序后正中间那个值,个数为偶数时取中间两个的平均,而这两件事在没排序的串上根本读不出来。四分位数与百分位数也一样,它们是由在排序里的位置定义的。第二种用法是极差,它就是最大值减最小值,而这一页直接把那两个数印出来——如果你要的只是那个差,range-calculator 做减法。第三种是普通人最朴素的用法:从表格里贴过来的一列测量值、价格、年龄或成绩,排好之后好读得多,因为极值跳出来了、聚集也看得见了。这也是为什么排序是画图前的第一件事——频数统计与直方图都从它开始。第四种用法是核对你手里那个软件的排序。当一列数据被格式化成奇怪的样子时,按文本而不是按数值排序是表格软件里常见的错误,症状恰是上面描述的那个——10 在 9 前面,或者 12.5 在 4 前面。如果一列排好的数看着不对劲,把同一批值放进这一页跑一遍,就知道两者之中是哪一个读错了输入。排好之后,描述统计那几页接手:median-calculator 读中间,range-calculator 读两头,quartile-calculator 读四分之一位置,而 average-calculator 读平均值——它是这几个里唯一不在乎顺序的。

算例

  1. 正负混杂加一个小数:7; −3; 12.5; 0; −10; 4

    1. 先找最小的值:−10 比这一串里任何数都靠左
    2. 接着是次小的 −3,然后是 0,然后是 4,然后是 7
    3. 12.5 最大,排在最后
    4. 排好的串是 −10、−3、0、4、7、12.5,它的两头就是最小值与最大值

    这一页的默认输入,而且是有意挑得别扭的一个:它有两个负数、一个正小数和一个零,一次把两个坑都踩到。注意 −10 排在第一位,尽管 −3 才是看着更长的那个;以及 12.5 排在 7 后面,尽管 12.5 和 1 打头。按文本排这些会得到 −10、−3、0、12.5、4、7——负数那一头碰巧看着是对的,而小数落错了地方。

  2. 个位数藏不住的那个坑:9; 10; 100; 2

    1. 按值比,不按第一位比:2 比 9 小
    2. 10 比 9 大但比 100 小
    3. 顺序是 2、9、10、100
    4. 最小的是 2,最大的是 100

    四个短数、全是正的,也是能抓住文本排序的那一串。按字符串比会把 10 排在最前、2 排在最后,因为比较在第一个字符上就停了:1 在 2 前面,2 在 9 前面。正确的顺序来自比较值,而出错的迹象是结果看着不像一条数轴——没有任何一种数字的排法能让 10 坐在 2 前面。这一格值得用来测任何排序代码,因为一串个位数两种做法都对。

  3. 负数的另一个方向:−5; −20; −3

    1. 在数轴上,−20 是这三个里最靠左的
    2. −5 在它右边,而 −3 是三个里最靠右的
    3. 所以升序是 −20、−5、−3
    4. 最小值是 −20——这一串里数字看着最大的那个

    上一个算例的镜像,也是抓住读者而不是抓住代码的那一格。−20 是三个里最小的,尽管它的数字最大,因为在线上越靠左就越小。按文本排恰好会把这一格排对——字符串 −20 确实在 −5 前面——所以负数这一档是文本排序看着正确的地方,而正的多位数那一档才是它崩掉的地方。两格合起来把两个方向都盖住了,这也是它们都在这里的原因。

局限

这一串收 1 到 200 个数,可以用逗号、分号或空格分隔,三种也可以混用。两百是这一页愿意收多长一串的上界,不是性能护栏——更长的串不是慢,而是被拒绝,因为这么长的输入框已经没法编辑、答案也没法读了。数可以是负的、可以带小数、可以是零,重复项保留而不是去掉。千分位分隔符不认识:逗号后面跟一个空格才是分隔,而夹在两位数字之间、后面不带空格的逗号按小数点读(1,5 就是一点五)。1,500 这种形状两者都不是,1500 还是 1.5 判不了,所以会被直接拒收、不去猜——从表格里贴过来的、大数带分组的那一列是被拒绝的,不会被悄悄读错。贴之前先把分隔符去掉。指数记法也不认识,所以 1e5 是拒绝而不是读成 100000。输出是每个值的规范拼写,而不是你输入的逐字复制:12.50 印成 12.5、+7 印成 7、−0 印成 0。极大的值在输出里会改用指数记法,从 10²¹ 起,那是数字转字符串自己换记法的位置;要压平它就得再写一套数字打印机,而这一页没有。这一页没有参考表:表是用来展示一个结果落在哪一档的,而排序没有档。只提供升序一个方向——要降序,把输出从右往左读即可。

常见问题

一串数里既有负数又有小数,怎么排?
贴进来让这一页排——分隔符可以是逗号、分号或空格,三种也能混用。负数与小数都不改变规则,规则只有一条:越小的数越靠左。唯一要当心的是 −20 比 −3 小,尽管它的数字更多;以及 12.5 比 4 大,尽管它以 1 打头。按值而不是按数字的文本去比,就是这里正确性的全部。
我输入这些数的顺序有影响吗?
完全没有——你给什么这一页就排什么,同一组数无论以什么顺序进来,输出的都是同一个结果。这正是结果可以核对的原因:排一遍,再排一遍,输出一模一样,因为一组确定的数只有一种升序。输入的形状唯一残留的地方是重复项,因为 5、5、3 与 3、5、5 排出来都是 3、5、5。
重复的数会被去掉吗?
不会,这是有意的。输出是输入换了顺序,所以它必须恰好装着你给的那些数,每个出现你给它那么多次。去掉重复是另一件事——那叫去重,它会改变关于这一串的每一个问题的答案,包括一共有几个值、中位数是多少。如果你要的是一串互不相同的值,那是另一步,而且那一步应该是看得见的。
为什么 12.50 回来变成了 12.5?
因为末尾的零不是值的一部分,而这一页印的是每个数的规范拼写,不是照抄你输入的样子。同一个归一化会把 +7 变成 7、把 −0 变成 0。这是输出唯一一处不完全等于输入的地方;如果你那些数的写法本身带有含义,这件事就值得知道——比如金额,12.50 与 12.5 在人眼里读起来是不一样的,尽管它们是同一个数。
能不能按从大到小排?
这一页给的是升序,而降序就是把同一个输出从右往左读——没有额外要算的东西,因为把一个排好的串倒过来立刻就得到逆序。这一页只提供这一个方向,是因为下游每一个统计量要的都是它:中位数、四分位数与极差全都是从升序那串定义的,给一个降序的反而要先倒回来才能读。
为什么我从表格里贴过来的一列被拒绝了?
几乎一定是千分位分隔符。这一页上逗号加空格才是分隔,而夹在两位数字之间、后面不带空格的逗号按小数点读;1,500 这种形状两者都不是,1500 还是 1.5 判不了,所以整串会被直接拒收、不去猜。指数记法同理:1e5 也是拒绝,而不是读成 100000。贴之前先把分隔符去掉。

参考资料

相关计算器