总结回顾 - 数据结构和算法98(完)

总结回顾

 

让编程改变世界

Change the world by program


  我们这节课主要来总结回顾我们之前讲过的各种排序算法,我们首先讲了排序的定义,并提到了排序的稳定性,如图 图片1   排序的稳定与否对于某些特殊需求来说是至关重要的,因此在排序算法中,我们需要关注此算法的稳定性如何。 我们根据排序记录是否全部被放置在内存中,将排序分为内排序和外排序两种,外排序的话需要考虑内外存之间多次交换数据的消耗,我们之前讲的主要都是围绕内排序算法来讲的。 图片2   根据排序过程中借助的主要操作,我们将内排序分为:插入排序、交换排序、选择排序和归并排序四类,之后我们介绍的7种排序算法,就分别是各种分类的代表,请看图: 图片3     事实上,目前还没有十全十美的排序算法,有优点就会有缺点,即便是快速排序算法,也只是在整体性能上比较优越,但它也存在排序不稳定,需要比较多的辅助空间,对数据量很少的情况下并不显优势等的不足。因此我们就要从多个角度来剖析一下提到的各种排序。 图片4   大家可以把这个表保存起来,以便今后使用的时候随时可以参照。   OK,上边三种呢是简单排序算法,下边深颜色的四种是属于改进的排序算法,从平均情况来看,显然最后三种改进算法要胜过希尔排序和前边三种简单排序算法。 从最好情况来看,反而是冒泡排序和直接插入排序要更胜一筹,也就是说,当你的待排序序列总是基本有序的前提下,反而不应该考虑下边四种复杂的改进排序算法。   从最坏情况来看,堆排序和归并排序又强过其他排序算法。 那么这样一来,我们可以得出这样一个认识:堆排序和归并排序就像两个参加奥数考试的优等生,心理素质强,发挥稳定。而快速排序则更像是一批情绪化的黑马,心情好的时候表现突出,碰到比较糟糕的环境则会变得不那么理想。但是他们如果都来比赛计算个位数的加减法,它们反而算不过小学生级别的冒泡排序和直接插入排序。   从空间复杂度来说,归并排序强调要马跑得快,就得给马吃个饱。快速排序也有相应的空间要求,反而堆排序等却都是极少的索取,大量的付出,对空间要求都是O(1)。所以如果执行算法的软件所处的环境非常在乎内存使用量的多少时,例如单片机和嵌入式编程,选择归并排序和快速排序就不是一个较好的决策了。   从稳定性来看,归并排序独占鳌头,我们前边也说过,对于非常在乎排序稳定性的应用中,归并排序是个好算法。 从待排序记录的个数来说,待排序的个数越少,采用简单排序方法就越合适,反之,如果待排序的个数越大,采用改进的排序算法就越合适。这也就是为什么我们上节课对快速排序进行优化时,增加了一个临界点判断,当待排序个数低于这个临界点7的时候,我们果断换作直接插入排序效率更高的原因。   总之,综合各项指标来说,经过优化的快速排序是性能最好的排序算法,但是不同的场合我们应该考虑不同的算法来应付,所以像上节课对快速排序那种改造是比较合适的。 好了,排序算法的总结就到此为止。   我知道我们当中有很多鱼油被迫来学习数据结构和算法,其实是由于学校开了这门课程呢或者说研究生考试需要这门课的知识,不得已才来学习。 因为这门课程注定是枯燥乏味的,总共98讲的数据结构课程,没有教会你写一个狂暴炫酷吊炸天的应用实现,所以很多朋友觉得学习数据结构和算法只需要应付考试就可以了。   其实,数据结构和算法对于程序员的职业人生来说,那就是两个圆圈交集的那一小部分,很多同学发现大学毕业进了单位,突然发现大学里老师所教的知识似乎都用不上了,突然发现以前憧憬的狂暴炫酷吊炸天的应用实现其实只需要简单的调用已有代码即可。 真正让人抓狂的是面对一箩筐别人写的层层叠叠的代码,需要你在此基础上继续修改和开发,这时候你才发现代码功底不足够,从而力不从心、追悔莫及。   所以,如果你有时间,请用心掌握好这门课程,你今后的编程之路将会是一马平川! 在视频的最后,小甲鱼要感谢大家,正是因为有你们的支持,小甲鱼的教学梦想才得以一步步实现。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/BdsUAwK.RwC-ox1T868']视频下载[/Downlink] [Downlink href='http://urlxf.qq.com/?MrmQ3m2']备胎下载[/Downlink]
posted @ 2014-03-10 19:47  我就爱小甲鱼  阅读(318)  评论(0编辑  收藏  举报