【软考】有趣的算法

来源:互联网 发布:淘宝有没有卖透视眼镜 编辑:程序博客网 时间:2024/05/16 06:20

基本介绍

     对于习武之人,一招一式不过是花拳绣腿。真正决定胜负的还是要比拼内功。对于程序员来说,算法便是我们必须要修炼的一项基本功。它的重要性自然不言而喻。本篇博文就几种常规的算法做一个总结,欢迎相互交流。

算法:插入排序 选择排序 冒泡排序 快速排序

研究重点

  算法的实现

  时间、空间复杂度

  特殊情况

一插入排序

 实例:图书馆整理图书

       

    注:假如上图中我们要求的顺序是蓝 红粉等等 。图中是蓝粉是已经排好的,红色的书是即

    将要排序的,红书后面是无序的。现在我们将 红色的书就是要和粉的比一下,如果在粉的前

    边,那么就要把粉往后挪一点给红色的书腾出一个位置。


2过程

 

                         

              图一                                     图二

注:i=4时 将第i本书复制一个到临时存的位置,然后从i前的一本一次和临时存储中的去比较,

如果粉书应该排在后面,那么它就往后挪一个位置。这一趟排完之后,把临时存储的这本红放到

给它腾出来的位置中去。


3相关量

时间复杂度:正常情况下,如果要排n本书, 外层要依次对n-1本书进行选位置。也就是进行n-1趟内层依次为1~n-1。

           时间复杂度是内外两层关于n的一次函数的乘积。即为0(n2)
           最佳情况,如果要排n本书,假设这些书本来就是有序的,那么实际上遍历n-1本书只进行
了和它相近

           的一本书的比较。时间复杂度与内层的n无关了。即为O(n)

空间复杂度:看我的框图,只占用了一个空间,和n无关,即为O(1)

稳定性:如果有相同的两个数,那么插入排序总是后面的排在后面。即稳定。

 

二选择排序


   实例:拔河比赛安排队员。如果老师要找几个人参加拔河比赛,那么他可能会从班里先找一个最胖的

把他安排到压轴位置,然后再从其它人中找剩下的人中最胖的的并将其安排到确定的位置。以此类推。

                   

2过程

如果我们从最小的开始找,就是每次找一个最小,放到最前面,然后从剩下的数中再去找一个其次小的。放到已排好的后面。整体也就是这样一个三角形。

        

相信上过米老师课的人应该都对三个数比较大小这个算法印象深刻。套用上面的情况就是

先假设它是最小的,结果它就是最小的。没错,这就是选择排序的灵魂。那么究竟是怎样

实现的呢。下面这个框图粗略的解释一下每一次选择过程。

               

 

3相关量

时间复杂度

    思路和上面算法一样,因为一趟要找到一个最小值。所以外层  n个数要找n-1次。内层

     依次为n-1 ~1

    总的时间复杂度是  内外两层关于n的一次函数的乘积。即为0(n2)

空间复杂度

    看我的框图,只占用了一个空间,和n无关,即为O(1)

                                    
稳定性

    因为选择排序有对调过程。假设6 5 6 2  排序,那么采用选择排序的话 第一次排序之后,

    6就已经被调换到6之后了。最后结果为2 56 6 即不稳定。

 

三冒泡排序

    实例 因名而来。你看图中的①

                

这种情况是相邻两数相比,将较小数往上移 ,在去和下一个数比较,满足条件调换位置。

当然还有一种情况就是

    

    

有没有气泡的感觉.。o 0 你是不是也能画出一个和选择排序相似的三角形?

 

   相关量

在冒泡排序中有一种特殊情况就是:当第一趟排序之后没有可交换的,即已经是有序时,就停止比较。

所以会出现平均复杂度为0(n2) 最好情况为0(n)。稳定。空间复杂度为0(1)

 

四 快速排序

1实例:照相。为了比较快速分两排,摄像师一般 会说以谁谁为准,高的在后站 矮的在前站。

这一步和快速排序的思想是一样的。以较快的速度先分出两拨。然后每拨中重复上述。

 

效果和照相一样,具体过程可能不太一样。在每次排序中,从两头开始,小头比大头大则对调。

由于它每次对半分,所以趟数是log以2为底 n的对数。每次还有2~n组。 所以总的时间复杂度

为nlog2n。 又由于结点都要保存,每运算一次,需要一个结点。所以它的空间复杂度也是nlog2n

。不稳定。

 

最后上一张压轴的图。

                                

 

总结:

     了解算法的每一步之后,再去做相关的题就基本不是问题了。虽然我尽量想简单明白的表示一下。不过看来效果并不太好。相互交流欢迎大家多多提意见。

 

1 0
原创粉丝点击