数字以及字符串的排序
引子
工作中我们经常遇到两种排序场景.
- 对
数字
排序 - 对
字符串
排序 (对纯字母字符串排序|对纯数字字符串排序|对汉字字符串排序|对混杂了字母汉字数字特殊字符的字符串排序…)
这涉及到两种不同的排序算法
- 自然有序/自然排序
- 字典序/按字母序排序
例如:在自然排序算法中,数字2
小于数字10
.但是在计算机排序算法中,字符串10
小于字符串2
,因为10
中的第一个数字小于2
.
字典序
自然排序没什么好说的,大家都会.主要说一说字典序.
在绝大多数语言中,都提供了比较两个字符串大小的方法,比较的实际上就是两个字符串的字典序。
字典序dictionary order
,又称 字母序alphabetical order
.原意是表示英文单词在字典中的先后顺序,在计算机领域中扩展成两个任意字符串的大小关系。
在字典中,单词是按照首字母在字母表中的顺序进行排列的,比如alpha
在beta
之前。
当第一个字母相同时,比较两个单词的第二个字母在字母表中的顺序,比如account
在advanced
之前,以此类推。
下列单词就是按照字典序进行排列的:
as
aster
astrolabe
astronomy
astrophysics
at
ataman
attack
baa
那么看一下字母表顺序(其实就是ASCII
表)
123456789
ABCDEFG HIJKLMN OPQRST UVWXYZ
abcdefg hijklmn opqrst uvwxyz
注意:
- 字符串排序由两个字符串从左向右遍历遇到的第一个不同的字母决定,而不是由两个串的长度决定.
- 阿拉伯数字当作数字与字母进行排序时,结果不同.
实际应用
看一些实际问题
一本书的作者有很多,经常可以看到这样一句话"按作者姓氏笔画排序".
有产品给我提需求,按照组织架构首字拼音排序.
按照A-
后的数字自然排序
A-45
A-67
A-3
A-9
A-18
A-104
A-23
A-44
先按期号排名,期数相同的按照年龄排名.
按照汉字的编码表排序
mysql中一些容易犯错的排序场景
scene.1 对一个组合串进行基数排序时,最好可以拆分为两个字段存储
SELECT CONCAT(prefix, suffix) FROM items ORDER BY prefix , suffix;
SELECT item_no FROM items ORDER BY CAST(item_no AS UNSIGNED) , item_no
scene.2 比对一下两者的效率.
SELECT CONCAT(prefix, suffix) FROM items ORDER BY prefix , suffix;
SELECT CONCAT(prefix, suffix) as tmp FROM items ORDER BY tmp;
scene.3 排序顺序的默认值陷阱
SELECT prefix, suffix FROM items ORDER BY prefix , suffix DESC ;
等价于: SELECT prefix, suffix FROM items ORDER BY prefix ASC, suffix DESC ;
不等价于: SELECT prefix, suffix FROM items ORDER BY prefix DESC, suffix DESC ;
参考资料
汉字排序 https://www.cnblogs.com/huahuahu/p/Unicode-zi-fu-chuan-pai-xu-gui-ze-yi-ru-he-que-din.html
mysql中的排序 https://blog.csdn.net/q343509740/article/details/80611637
https://blog.csdn.net/qq_37050329/article/details/86637183#commentBox