排序的基本概念

什么是排序?:所谓排序,就是指:把一堆数据元素,按照它们的关键字 递增或者递减的顺序,把它们(数据元素)重新给排列一遍。(如下图)

总之,经过排序算法的处理之后,要保证这些关键字有序的(要么递增,要么递减)。

在排序这一章节里,各个数据元素的关键字是有可能相同的。

如下图(左)的王者荣耀排行榜就是以荣耀战力的值作为关键字排序的。

下图(右)的国内富豪财富排行榜(2019年末)就是以各个富豪的财富值作为关键字来进行排序的。

那么在这些场景下就可能会遇到多个数据元素的关键字值相同的情况。

排序算法的评价指标

1.时间复杂度        2.空间复杂度        3.算法的稳定性

什么是稳定性?

上面说过,排序时难免会遇到两个或多个数据元素的关键字相同的情况。例如下图给出的这个序列,其紫色的元素(左二)和其红色的元素(右一)就是关键字相同的两个元素(关键字都为3)。

将此序列经过排序算法处理之后,得到的最终的排序结果若是下图最左边的序列,其仍能保证紫色的3在红色的3的左边(二者的相对位置没有改变),即此排序算法是稳定的。

若经过排序算法处理之后,得到的结果是下图最右边的序列,其红色的3排到了紫色的3的左边,也就是说关键字相同的数据元素,它们的相对位置发生了改变,这样的排序算法是不稳定的。

结论:经过排序处理之后,关键字相同的数据元素,它们的相对位置若能够保持不变,那么这样的排序算法就称之为稳定的排序算法,反之,若它们的相对位置发生了改变,那么这样的排序算法就称之为不稳定的排序算法

※排序算法的稳定性是经常在选择题中考察的,所以之后在学习任何一个排序算法的时候,也一定会分析这个算法的稳定性是怎么样的。

思考题:

问:稳定的排序算法一定比不稳定的好?

答:不一定,要看具体的应用场景。

若在某个应用场景中,所有的元素的关键字都不可能重复的话,在这种情况下,稳定的算法和不稳定的算法,在排序之后所得到的结果肯定都是一样的。

如果在某个应用场景中,对排序的稳定性没有什么要求,那么选择不稳定的排序算法也是OK的。

排序算法的分类

排序算法被分为两大类:分别是内部排序和外部排序。

内部排序:可以把所有的需要排序的数据都全部放在内存当中。

比如在写程序时定义了int[]类型的数组,它的数据都是放在内存当中的,对这些数据的排序就都是在内存中进行的。

外部排序:有的时候又难免会遇到,需要排序的数据量很大,没有办法全部放入内存的情况。要对这些数据进行排序,就只能先把需要排序的数据全都放入磁盘,然后再采取将这些数据一部分、一部分地放入内存中去处理的策略(具体怎么做,暂且不展开说)。

在设计内部排序算法的时候,只需关注这个算法的时间复杂度空间复杂度是怎么样的即可。

而在设计外部排序算法的时候,除了要关注这个算法的时间、空间复杂度之外,还需要关注怎么追求更少的读写磁盘的次数

∵ 对于内部排序算法,由于对数据的处理全部都是在内存当中的,而内存又是一个很高速的设备,所以在设计内部排序算法的时候,不需要关注读写内存以及在内存中处理数据所消耗的时间,只需关注这个算法的时间复杂度空间复杂度是怎么样的即可。

∵ 而要进行外部排序,就意味着需要把磁盘当中存储的数据先读入内存,处理完了再写回磁盘。这一读和一写,会因为磁盘的读写速度很慢(所消耗的时间不可忽视),而导致会花费很多时间。

tips: 磁盘的读写速度很慢,以机械硬盘为例,其读写速度大概是100MB/s左右。相比之下,内存的读写速度可以达到60GB/s,比机械硬盘要快600倍左右。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值