本文主要是介绍【自考】插入排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
软考自考中数据结构与算法基础中很重要的一部分就是排序算法,以前总觉得这部分挺不好理解的这次自考软考都要用到,必须要好好理解一下了,今天先总结一下插入排序。
【知识点】
排序算法分为:插入排序、选择排序、交换排序、归并排序和基数排序,插入排序直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序),插入排序主要有直接插入排序和希尔插入排序。
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组,将相同颜色的分为一组,对每组进行插入排序
第一次排序结果如下:
第二次排序:增量为3,分成3组,将相同颜色的分为一组,对每组进行插入排序
第二次排序结果如下:
第二次排序:增量为1,也就是对整组进行插入排序,结果如下:
希尔排序的执行时间是依赖于增量序列的,好的增量序列有如下共同特征:最后一个增量必须是1;应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。
在排序算法中感觉考得比较多的还是时间复杂度及其稳定性,各类排序的精华部分都总结在如下表中:
【小结】
各类排序关键还在于如何理解,可以多联系生活,找些自己容易理解的例子,这样也更容易掌握。现在准备软考自考,感觉每天的时间都不够用的,每天晚上小组内一起学习讲题,学习起来也很有动力,接下来的日子继续加油!
这篇关于【自考】插入排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!