![Python算法设计与分析从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/845/44509845/b_44509845.jpg)
4.5 希尔排序算法
希尔排序法是插入排序法的一种高级改进版本。希尔排序法可以减少插入排序法中数据移动的次数,加快排序进程,因此又被称为缩小增量排序法。
希尔排序法的基本思想是:将原始数据分成特定间隔的几组数据,然后使用插入排序法对每组数据进行排序,排序后再减小间隔距离,重复插入法对每组数据排序,直到所有数据完成排序为止。
例如,有一组数据:60, 82, 17, 35, 52, 73, 54, 9,如图4.33所示。采用希尔排序算法对其递增排序,步骤如下。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P104_9803.jpg?sign=1739288976-QJNSXSNncQmOP6rfOmycQZyrduPjnwk2-0-7332a3ec6dc9a286345a576b4142c052)
图4.33 原始值
(1)原数列中有8个数据,将间隔数设置为8/2=4位,即每间隔4位的数据为一组,共分为4组,数列1为60, 52,数列2为82, 73,数列3为17, 54,数列4为35, 9,图4.34所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P104_9807.jpg?sign=1739288976-oOoXRxtRYbK79XOcr87I7up6KX7XAV2V-0-55bdcc98b5cc6ed9a7c7150ef67bd774)
图4.34 间隔4位划分
说明
间隔位数可以根据需求而定,不一定非要除以2。
(2)将每个数列内的元素按照左小右大的原则进行排序,最后得到的数列1为52, 60,数列2为73, 82,数列3为17, 54,数列4为9, 35。第一次排序结果如图4.35所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P105_9823.jpg?sign=1739288976-dZb1zhVNCSWMfYIC7Nl57KRWqUiWMOKB-0-7ddc88c63c4d2482a98bc280baafbdce)
图4.35 第一次排序结果
(3)缩小间隔数为2位,即将原数列间隔2位的数据为一组,共分为两组数列,数列1为52, 17,60, 54,数列2为73, 9, 82, 35,如图4.36所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P105_9827.jpg?sign=1739288976-qWjEUTgZc4pOIC99JQoJbxZ8uDDCsMwU-0-b77e9a423acb4fc63b5651892f69097e)
图4.36 间隔两位分组
(4)对每个数列内的元素从小到大进行排序,位置错误的元素进行交换,最后得到的数列1为17, 52, 54, 60,数列2为9, 35, 73, 82。第二次排序结果如图4.37所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P105_9831.jpg?sign=1739288976-8G9AEUbwrSLQVTc7KWJWB5zqZrlTcoUI-0-c8146970c71800519ba4f28c8332acb1)
图4.37 第二次排序结果
(5)继续缩小间隔数为1位,对图4.37中的元素进行排序,最后的排序结果如图4.38所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P105_9835.jpg?sign=1739288976-QnIDMGLv2q9jGC6K97p3DcxRH8YOxYVW-0-335b28bd1ec21da6d36462b401d24967)
图4.38 排序结果
【实例4.9】 使用希尔排序法将列表中的数字递增排序。(实例位置:资源包\Code\04\09)
用Python代码实现上方示例中的希尔排序算法,具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P105_32963.jpg?sign=1739288976-Bl2EoJXg19yQHnPkNYG7YZwma4ftOniE-0-cc6aac74456ef587e08275609c0d2bed)
运行结果如图4.39所示。
【实例4.10】 新闻头条。(实例位置:资源包\Code\04\10)
每天都会有各种各样的新闻发生,点击率较高的新闻就会成为新闻头条。编写程序,利用希尔排序法,根据新闻的点击率对新闻标题进行排序。具体的Python代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P106_32965.jpg?sign=1739288976-1yIZk7EbG4I8NJVOBc6LPQ57EOwy35IT-0-a982a01567c9484dede0218ded428cc2)
运行结果如图4.40所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P107_10171.jpg?sign=1739288976-HlHDrROBlWgp36GWodVrcvpPj4oANE6v-0-3f3c88071bf204d0f5b396bf99720395)
图4.39 希尔排序法
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P107_10178.jpg?sign=1739288976-PjykEBSIFwMZtFk5dOnGORHmCHWa0YtY-0-06347fbf5d393d012ea8a2e95064edf4)
图4.40 运行结果