排序算法系列之(零)——排序初体验

来源:互联网 发布:虚拟现实平台软件 编辑:程序博客网 时间:2024/05/29 09:38

前言

一直想总结一下排序这个系列,可总是抽不出大块的时间来整理,算法这个东西没有充足的时间反复磨合是不能完全消化吸收的,回想一下我上一次总结排序算法还是在大学期间的图书馆里,转眼间毕业后工作已经两年多了,我对这些算法又有了不同的理解,有时候会有顿悟的感觉,就是那么突然的一瞬间,仿佛一切都明白了。

内容

说起排序算法,算是我用的比较多的算法之一了,回想当年奋战ACM竞赛的时候,排序是一个无法避开的点,而我用的最多的排序要数冒泡排序了,为什么选择这一个算法呢?原因说起来就是简单粗暴、比较好理解,当时也不明白其中的精髓,说实话这个冒泡算法的结构就是上课的时候背下来的。

后来随着解题中的越来越多的”Time Limit Exceeded”,我渐渐发现冒泡排序这种方法时间复杂度太高了,于是后来接触到了qsort函数,用这个函数排序简单方便,并且运行速度快,冒泡排序也就渐渐的被我淡忘了,但是一些不考效率的小程序我也会用到它的。

关于对排序算法的理解,我认为算法这个东西只有用多了才会有自己的理解,想想我们一开始学习排序的时候,很多同学会把选择排序写成冒泡排序,或者把冒泡排序写成选择排序,明明是两种不同的算法,为什么会用那么多同学把它们写反呢,其实在刚学习的时候我们就是在背算法结构,根本没有多少自己的理解成分,那些勉强没有把算法写串的同学,也会出现把’<’写成’<=’,或者把边界条件写错,不是丢下一个元素不排序,就是数组越界导致程序崩溃。

其实出现上述问题的根本原因就是没有把算法读懂,有人会问,这个究竟需要多少长时间才能完全理解呢?关于这个问题我没办法给出确切的答案,我是今天早上在地铁排队进站的时候想突然明白——“选择排序为什么不叫冒泡,而冒泡排序为什么不叫选择”,这或许就是量变到质变的一种体现。

对比

关于排序算法的总结,网上的文章简直太多了,拿来应付应付考试或者面试还是不错的,但是我想在总结中加入自己的理解,总体思路是采用先分后合方式,即再用三分归晋的总体思路,我们先来聊聊每一种排序,看看他们的由来、特点、以及优缺点,然后再来个总体的对比,当然,期间会加入小对比,比如我们先来说说今天早上我突然冒出想法。

下面来回答一下这个问题——“选择排序为什么不叫冒泡,而冒泡排序为什么不叫选择”,听到这个问题你或许会冒出个想法,我们老师就是这样讲的,这个A算法就是冒泡,那个B算法就是选择,这哪里用说为什么啊,如果你这样想说明你还没有自己的理解。

我来说说我的理解:所谓选择就是从两个及其以上的范围内挑选一个,而选择排序就是利用了这个特点,我们以从小到大的排序为例,选择排序首先在n个元素中找到最小元素的索引,如果索引指向不是第1个元素,就要交换,然后在排除第一个元素的n-1个元素中找到最小元素的索引,尝试与第2个元素交换,以此类推,选择n-1次就完成了一次完整的n个元素的排序,可以说选择排序的名字来源于它所使用的方法。

而冒泡排序的名字来源于它的行为,“冒泡”这个词非常得形象,我们还是以从小到大的排序为例,冒泡排序首先会比较前两个元素,如果前一个元素大于后一个元素,我们就进行交换,然后比较第2个元素和第3个元素,如果还是前一个元素大于后一个元素,我们就进行交换,一直比较到第n-1和第n个元素。假设第一个元素是n个元素中最大的元素,那么这个元素就会通过两两交换n-1次最终被交换到最后,看起来是不是非常像冒泡,依次类推,我们可以通过n-1次冒泡完成n个元素的排序。

总结

相信大家在明白了这两个排序算法的思路以后,应该不会再写反了吧。这一篇总结可以作为整个排序系列的开篇,接下来我会把排序算法依次讲解,我会在其中加入我的思考,希望你能够理解我的想法,至于下一篇我会先总结那个排序,视我心情而定。

1 0