【软考】插入排序

        软考自考中数据结构与算法基础中很重要的一部分就是排序算法,以前总觉得这部分挺不好理解的这次自考软考都要用到,必须要好好理解一下了,今天先总结一下插入排序。

        【知识点】

         排序算法分为:插入排序、选择排序、交换排序、归并排序和基数排序,插入排序直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序),插入排序主要有直接插入排序和希尔插入排序。

        1、概念

        插入排序:基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。插入排序的主要方法有直接插入排序和希尔插入排序。

         2、直接插入排序:

        即当插入第i个记录时,R1,R2,R3.......Ri-1均已排好序,将第i个记录Ri依次与R1,R2,R3.......Ri-1进行比较,找到合适的位置,将其正确插入到序列中。当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位,直到所有的排序完成。直接排序简单明了,但是速度比较慢。

         扑克牌相信每个人都玩过,在我们玩牌的过程中多数人的习惯是一边摸牌,一边理牌,也有些是全部发完在整理。其实这个整理牌的过程就相当于我们的直接插入排序。假如你手上有这样一幅牌,我相信每个人都会马上整理成有序的,然后就是等着赢了。

                              

         直接插入排序其实是比较简单的,纸牌的例子是从这里看到的,里面讲的很清楚,不明白的可以再看看。

         3、希尔排序

         希尔排序(Shell Sort)是插入排序的一种,因D.L.Shell于1959年提出而得名。

        基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

         看定义感觉挺复杂的,其实关键点就是他的增量d,增量如何求?举个例子更好说明一下:

          比如对关键码{49,38,65,97,76,13,27,49,55,04}进行排序,这里n=10,所以第一个增量d1=2/n=5;也就是将数列分成五组,每两个数一组,第一个距它的同组的距离也为5,分成的五组是{49,13}、{38,27}、{65,49}、{97,55}、{76,04},然后对这五组进行插入排序,组成新的一组数列。以此类推,第二次排序的增量d2=d1/2=3,第三次增量d3=d2/2=1。

         一般取d1=2/n,di+1=di/2,需要注意的是如果增量结果是偶数,则加1,保证di是奇数。

         该数列初始状态如下:

        

         第一次排序:增量为5,分成5组,将相同颜色的分为一组,对每组进行插入排序

        【软考】插入排序_第1张图片

        第一次排序结果如下:

       【软考】插入排序_第2张图片

         第二次排序:增量为3,分成3组,将相同颜色的分为一组,对每组进行插入排序

       【软考】插入排序_第3张图片

         第二次排序结果如下:

       【软考】插入排序_第4张图片

         第二次排序:增量为1,也就是对整组进行插入排序,结果如下:

       【软考】插入排序_第5张图片

        希尔排序的执行时间是依赖于增量序列的,好的增量序列有如下共同特征:最后一个增量必须是1;应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。

        在排序算法中感觉考得比较多的还是时间复杂度及其稳定性,各类排序的精华部分都总结在如下表中: 

              【软考】插入排序_第6张图片     

        【小结】

        各类排序关键还在于如何理解,可以多联系生活,找些自己容易理解的例子,这样也更容易掌握。现在准备软考自考,感觉每天的时间都不够用的,每天晚上小组内一起学习讲题,学习起来也很有动力,接下来的日子继续加油!


你可能感兴趣的:(软考,插入排序)