【基础算法】插入排序

【前言】

      在伟大的导师米老师的带领下,我们又一次集体领会了一下排序算法的精彩思想。在我们一起对选择排序与冒泡排序思想进行回顾之后,伟大导师又给我们的探索之路冒头了一个新的悬念——插入排序。 那么什么是插入排序呢?这把我进行了一个小小的摸底。

【正文】

一、什么是插入排序?

       有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序

                                                          ——百度百科

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,  然后用1469比较 ,14<69, 69向右移动一位变为14 13 23  _ 69 ,然后2314比较同上, 然后1314比较,发现14>13(r[0].key≥r[j].key),于是中止比较, 把14插入到13后边, 变成131423 69

 

2.折半插入排序:

     这个有点像我们小时候学的二分法求方程解, 就是一直找中间的数做比较,一次排除一半的数据。

 

例子:13 23 69中 插入14,第一次14231423小, 因为原来的数列是从小到大排的(有序的)所以不必考虑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 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农胖虎-java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值