![Python算法设计与分析从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/845/44509845/b_44509845.jpg)
4.3 插入排序算法
插入排序法是将数列中的元素逐一与已排序好的数据进行比较,进而找到合适的位置并插入。例如,在排好顺序的两个元素中插入第三个元素,就需要将其与其他两个元素做比较,插入合适的位置。也就是说,将第三个元素插入数列后,得到的新数列依然是排好序的。接着将第四个元素插入,以此类推,直至排序完成。直接插入排序法最后的结果也有两种形式,即递增数列和递减数列。
例如,有这样一组数据:58, 29, 86, 69, 10,如图4.16所示。采用插入排序算法使其递增排序,步骤如下。
(1)第一次排序。先用第一个位置的数据占位,放在新数列的第一个位置,如图4.17所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P98_8949.jpg?sign=1739352289-iAMH6ru5aL5kEGnQjBTvCBKzObdgE4BY-0-6157a19b3d0dce185ad54a1f2408d438)
图4.16 原始值
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P98_8950.jpg?sign=1739352289-aDZtCBZasa8V0yXDC7JGJg9zxf0sgbWh-0-d1abc1e41175b3ec068a59981c45b477)
图4.17 第一次插入
(2)第二次排序。取原数列第二个位置上的数29与58进行比较,29小于58,所以将其插入58前面的位置,将58向后移一位,如图4.18所示。
(3)第三次排序。取原数列第三个位置上的数86与29和58进行比较,86大于29和58,因此直接将86插入新数列的第三个位置上,如图4.19所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P98_8954.jpg?sign=1739352289-UVyvfjjuPnxhGk5kSrIfFBv15E3AjNhI-0-6c7fd34e616a5698ccfc9410c792b1b2)
图4.18 第二次插入
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P98_8955.jpg?sign=1739352289-u8QHzRmzMIZ0JtZHqiizakoxM5M2vmYy-0-9ad537685240873ef763c2a99aa88238)
图4.19 第三次排序过程
(4)第四次排序。取原数列第四个位置上的数69与29、58和86比较,69大于29和58,小于86,因此直接将69插入86前面的位置上,将86后移一位,如图4.20所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P98_8959.jpg?sign=1739352289-1JEUM8iJQekoc28ihjyA1ZQnmkvZXy4f-0-26a01c65754f2a6aadf9f131bbd57a63)
图4.20 第四步排序过程
(5)第五次排序。取原数列第五个位置上的数10分别与29、58、69和86比较,10小于29、58、69和86,因此直接将10插入29前面的位置上,将29、58、69、86依次后移一位,如图4.21所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P99_8968.jpg?sign=1739352289-aSoL2ewwmG008619XkTif4t3zm8xJliP-0-f4a027d66fa6f97737b6292211fa6ee9)
图4.21 第五次排序过程
直接插入排序的最终排序结果如图4.22所示。至此,排序完成。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P99_8972.jpg?sign=1739352289-LU35awPaV5Ekxs96XDom8SCgnb88Ea7e-0-ba7a7f5e0f49985a75de6d287173310a)
图4.22 最终的排序结果
【实例4.5】 使用插入排序法将列表中的数字递增排序。(实例位置:资源包\Code\04\05)
用Python代码实现上方示例中的插入排序算法,具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P99_32957.jpg?sign=1739352289-zpHdEBJ5V25GSEL3UqnXK2tNYTG7idQL-0-3782688a0b00230d246c6690d8139310)
运行结果如图4.23所示。
【实例4.6】 跳绳比赛排名。(实例位置:资源包\Code\04\06)
某校体育考试,利用插入排序算法将这3位考生的跳绳成绩从高到低排序,并输出冠军、亚军、季军的名单。具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P100_32958.jpg?sign=1739352289-x0WDAsgeaplQ1ZJieZhseaYxSdL4RgOy-0-d66685c9b0d6c3f41d5930d97278f0c5)
运行结果如图4.24所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P100_9297.jpg?sign=1739352289-e2JOrZ87Pwqj0iwzB2OxB4yDU6bVNKSY-0-2669058afd82d4cf2064c018c0c51cfe)
图4.23 插入排序法
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P100_9305.jpg?sign=1739352289-gcDzaIs7yNQKaeI9UUxYNGCpbWGbrXtQ-0-e79929da1d6df9364634dec4a9fda4d4)
图4.24 运行结果