排序的本质、数据类型及算法选择

排序的本质、数据类型及算法选择

前两天老金写了篇 "十大排序简介",有点意犹未尽,这一回老金想把排序连根拔起,从排序的本质说道说道。

一、排序的本质

从字面上理解,排序就是把一堆乱糟糟的东西按照一定的规则排得整整齐齐,使无序变有序。

人喜欢有序,但大自然是喜欢无序的。

排序一词的英文是sort,这个词本来是"分类"的意思。分类是将相似的东西分到一起,表面上看和排序貌似没什么关系,实际上大多数分类都是有序的。

比如,东汉末年分三国,为什么人们都是说魏蜀吴,而不说蜀吴魏?

因为有了人,世间的一切都有了价,有了价便是有了等级。

所谓的排序,本质上就是划分等级。

对于编程来讲,排序就是将数字按从小到大的顺序排列。

没错,无论排什么,最终本质上排的都是数字。

如果把数字看成长短不一的仙人板板,那么,排序前:

排序后:

是不是赏心悦目好多?

二、排序的数据类型

常见的用于排序的数据类型有:
1. 数字排序

不要多说,不要多问。这是最基本的排序类型,包括整数、浮点数等。
2. 字符串排序

按字母顺序对单词或句子进行排序,看着是字母,实际上排的是ASCII码,而ASCII码就是数字。
3. 日期和时间排序

要将日期和时间转换为可比较的数值形式,然后进行排序。
4. 多维数据排序

包含多个属性的数据,可能需要根据一个或多个属性进行排序。例如,学生的成绩,可以以总成绩为主关键字、以单科成绩为次关键字一起排序。
5. 特殊类型数据排序

如地理坐标(经纬度)、版本号(如软件版本号)、IP地址等,它们也有特定的排序规则。

三、排序算法的选择依据

排序算法一上来就10种,为啥要这么多呢?因为没有一种万能的算法能够解决所有问题。

软件工程先天具有复杂性,计算机的世界里有一句名言:

No Silver Bullet in Software Engineering。

幻想一炮就能解决所有问题是不可能的。

排序算法的选择在实际应用中至关重要,因为它直接影响到程序的性能和效率。选择依据如下:
1. 数据规模

如果数据规模很小(比如几十个元素),可以任性一点,选择简单好写的排序算法(比如冒泡排序、选择排序、插入排序)。如果数据规模很大(比如几万、几十万甚至更多个元素),就应选择效率更高的算法(比如快速排序、归并排序)。
2. 算法稳定性

有时,即便两个元素完全相同,排序时也需要保持其原始顺序,这个就叫排序算法的稳定性。比如800对新人的集体婚礼,男方有790人都叫王小二,现在按人名排序出场,如果你把这790个新郎官的次序搞乱了,那妹子们可要几家欢喜几家愁了。如果新娘里有女侠郭芙蓉,势必送你一招"排山倒海"。

稳定的排序算法有:冒泡排序、插入排序、归并排序、计数排序、桶排序、基数排序。
3. 空间复杂度

有些嵌入式系统的内存空间有限,应选择空间复杂度低的算法(比如快速排序、堆排序或插入排序)。

如智能手表为了降低成本、减小体积,内存就比较有限。在智能手表中,需要按时间顺序对心率、步数、睡眠质量等健康数据进行排序,这时候就可以考虑空间复杂度低的排序算法。
4. 数据有序性

如果数据已经有一定的顺序,那插入排序和希尔排序就是比较好的选择。它们能够利用已有的有序序列,减少比较和交换的次数,从而提高效率。

如果数据完全无序,可以选择那些不依赖于数据初始状态的排序算法,比如快速排序和归并排序。

相关推荐
A懿轩A10 小时前
C/C++ 数据结构与算法【排序】 常见7大排序详细解析【日常学习,考研必备】带图+详细代码
c语言·c++·学习·排序算法·排序
BabyFish1317 天前
hive中的四种排序类型
数据仓库·hive·hadoop·排序·order by·sorted
KevinRay_18 天前
Numpy指南:解锁Python多维数组与矩阵运算(下)
python·矩阵·numpy·排序·文件读写
五月高高1 个月前
Lambda表达式对List对象实现多个动态属性排序
java·排序
laufing1 个月前
OD C卷【智能成绩表】
排序
SunnyRivers1 个月前
Elasticsearch入门之HTTP高级查询操作
http·elasticsearch·排序·查询
Just_Paranoid2 个月前
Android 中文文件名排序实现案例教程
android·排序·中文排序
taller_20002 个月前
借助Excel实现Word表格快速排序
排序·表格排序·word表格·word排序·随机排序
IU宝2 个月前
快速排序的深入优化——三路划分,内省排序(C语言)
c语言·数据结构·算法·排序算法·排序