【前言】
在伟大的导师米老师的带领下,我们又一次集体领会了一下排序算法的精彩思想。在我们一起对选择排序与冒泡排序思想进行回顾之后,伟大导师又给我们的探索之路冒头了一个新的悬念——插入排序。 那么什么是插入排序呢?这把我进行了一个小小的摸底。
【正文】
一、什么是插入排序?
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。
——百度百科
PS:好吧!我承认, 官方的语言,通常情况下让人看了第一遍就再也不想看第二遍,而且第一遍也看不懂。 但是为什么每次我都要把官方的话贴上来给大家看看呢。主要的原因就是这些官方的语言虽然复杂,但是很严谨。 你用这些话给你的客户说的话,显得你很专业。要是三两句话讲明白了, 他可能会觉得这没什么。然后就不把你的工作当回事。有很多时候,我们不仅仅要有内在实力,还得能够让不懂行的人看起来觉的你也很专业。 当然,如果是教学生还是不要这么说话,不然会睡到一片的。
举个例子: 我们要把351插入1234(有顺序的数列——有序数列),并让它保持从小到大的顺序。这个时候用到的算法就叫插入排序算法。
二、插入排序有哪些具体分类
插入排序法又有:直接插入排序、折半插入排序、希尔排序三种,首先它们都是想在有序的数列中插入一串数列后使数列依然有序。但是具体的排序思想又略有不同。
1.直接插入排序:
(1) 设置监视哨r[0],将待插入纪录的值赋值给r[0];
(2) 设置开始查找的位置j;
(3) 在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j].key为止;
(4) 将r[0]插入r[j+1]的位置上。
——引自百度百科
例子
13 23 69中插入14 ,在有序数列最前方放一个空位置_,变为_ 13 23 69 ,然后位置中放入1413 23 69, 然后用14同69比较 ,14<69, 69向右移动一位变为14 13 23 _ 69 ,然后23同14比较同上, 然后13同14比较,发现14>13(即r[0].key≥r[j].key),于是中止比较, 把14插入到13后边, 变成131423 69。
2.折半插入排序:
这个有点像我们小时候学的二分法求方程解, 就是一直找中间的数做比较,一次排除一半的数据。
例子:13 23 69中 插入14,第一次14与23比14比23小, 因为原来的数列是从小到大排的(有序的)所以不必考虑69,直接和13进行比较,比13大所以确定排序为:
13 1423 69,减少了排序次序。
3.希尔排序:
对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。——百度百科
(这种排序其实是插入排序的一个变种, 和原本的插入排序还不太相同, 希尔排序是给一组乱序的数列进行排序。)
基本思想就是先分组,变成有序数列,再扩大每组规模,减少组数, 把乱序排序,变成组内直接插入排序。
例子:19 95 06 06
我们分两次:
第一次 间隔为二 于是有了两组 :1. 19 06 2.95 06
从小到大排序 编程 06 19 06 95
然后第二次 间隔为一,
即把06 95按直接插入排序法,排入06 19中去。
【总结】
同一个问题有许多不同的解决方式, 具体选用哪一种方式来解决,我们要看当时的具体环境来定。今天只介绍各种排序方法的思想,那么就到这里了。
关于选择排序和冒泡排序:http://blog.csdn.net/srk950606/article/details/50880517