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

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

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

一、排序的本质

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

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

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

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

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

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

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

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

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

排序后:

是不是赏心悦目好多?

二、排序的数据类型

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

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

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

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

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

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

三、排序算法的选择依据

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

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

No Silver Bullet in Software Engineering。

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

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

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

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

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

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

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

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

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

相关推荐
_extraordinary_3 天前
笔试专题(四)
算法·动态规划·贪心·模拟·排序·双指针
JLU_LYM9 天前
有序数组双指针问题
排序·双指针·有序数组
wanjiazhongqi1 个月前
常见的排序算法 【复习笔记】
笔记·算法·排序
Kevin Kou1 个月前
编程题-最大数(中等)
数据结构·c++·算法·排序
菠菠萝宝1 个月前
【Java八股文】10-数据结构与算法面试篇
java·开发语言·面试·红黑树·跳表·排序·lru
无双@1 个月前
算法分析—— 《归并排序》
数据结构·算法·leetcode·蓝桥杯·排序算法·排序·归并
闻缺陷则喜何志丹2 个月前
【C++前缀和 排序】891. 子序列宽度之和|2182
c++·算法·前缀和·力扣·排序·子序列·宽度
源代码•宸2 个月前
Leetcode—252. 会议室【简单】Plus
c++·经验分享·算法·leetcode·排序
轩情吖2 个月前
二叉树-堆(补充)
c语言·数据结构·c++·后端·二叉树··排序
L_M_TY2 个月前
E. Correct Placement
算法·贪心·排序·双指针