数据结构 - 排序的基本概念

首先排序的最简单定义是将“无序”的数据调整为“有序”的数据。

在排序中我们的输入和输出都是一种数据集合。很重要的一点是排序的依据是关键字之间的大小关系,所以就有可能出现,对同一个数据集合,针对不同的关键字进行排序,可以得到不同的序列。

排序中的关键操作——比较和交换

比较:任意两个数据元素通过比较操作确定先后次序

交换:数据元素之间需要交换才能得到预期结果

对于多关键字问题,只需要在比较操作时同时考虑多个关键字即可。

1、多关键字问题

很多时候我们会遇到多关键字排序的情况,比如有些学校在选择学生的时候会先看总分,总分相同的情况下重点关注数学成绩,这里的总分就是主关键字,数学成绩就是次关键字。

对于组合排序的问题有两种解决方案,一是先排序总分,总分相同的情况下再排序数学成绩;二是把总分和数学成绩都当成字符串首尾连在一起进行排序。显然第一种方式理解起来更加友好,但实现起来第二种方式更加容易。

编号 姓名/分数 数学 语文 英语 总分
1 藤原拓海  98 93 85 276
2 高桥凉介 95 84 97 276
3 中里毅 90 80 90 260

如果我们采用第一种方式,那就是先看总分,很明显中里毅被淘汰,然后在总分相同的情况下,再比较拓海和凉介的数学成绩,即98>95,拓海名次要高于凉介。不过我们采用第二种算法,很容易得到拓海“276098”要大于凉介的“276095”,更大于中里毅的“26090”(为了避免满分的情况,这里选择补0),所以拓海就排在了凉介和中里毅是、前面。

通过这个例子可以看出,多关键字的排序最终也都可以转化为单个关键字的排序,并不会因为关键字增多,算法就变得异常复杂。

2、排序的稳定性

当待排序记录的关键字均不相同时,排序结果是唯一的;

当待排序记录存在多个关键字相同的记录,经过排序过后这些具有相同关键字的记录之间的相对次序保持不变,则该排序方法是稳定的,若具有相同关键字之间的相对次序发生变化,则称这种排序方法不稳定。

继续上面的例子,出现了关键字相同的情况(总分),如果只考虑总分,不考虑语数外单科成绩,那么拓海和凉介的排名是可以颠倒的。但是排序前拓海名次高于凉介,排序后,如果是稳定的排序,则依旧保持这样的名次关系;如果是不稳定的排序,则排序后凉介的名次就要高于拓海。

稳定性的概念清楚了,不知道各位是否和我有同样的疑问,那就是排序稳定性的意义是什么?为什么要引入这样一个概念?于是找了一些参考资料,看到如下的解释似乎有一点明白了(参考链接

1、如果只是简单的进行数字的排序,那么稳定性将毫无意义。
2、如果排序的内容仅仅是一个复杂对象的某一个数字属性,那么稳定性依旧将毫无意义(所谓的交换操作的开销已经算在算法的开销内了,如果嫌弃这种开销,不如换算法好了?)
3、如果要排序的内容是一个复杂对象的多个数字属性,但是其原本的初始顺序毫无意义,那么稳定性依旧将毫无意义。
4、除非要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的算法,例如要排序的内容是一组原本按照价格高低排序的对象,如今需要按照销量高低排序,使用稳定性算法,可以使得想同销量的对象依旧保持着价格高低的排序展现,只有销量不同的才会重新排序。(当然,如果需求不需要保持初始的排序意义,那么使用稳定性算法依旧将毫无意义)。

3、内排序和外排序

根据排序过程中待排序的记录是否全部放置在内存中,排序分为内排序和外排序。

内排序是指在排序的过程中,待排序的所有记录全部放置在内存中。外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。

对于内排序来讲,排序性能主要受以下三个方面影响:

时间性能:关键性能差异体现在比较和交换的数量;

辅助空间:完成排序需要的额外存储空间,不过当下硬件发展的速度远远超过软件,所以必要时可以空间换时间;

算法实现的复杂性:过于复杂的排序会影响代码的可读性和可维护性,也可能影响排序的性能。

其中时间性能是区分排序算法好坏的主要因素

 

发布了46 篇原创文章 · 获赞 15 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览