手写希尔排序算法
昨天给大家介绍了插入排序算法,今天介绍的希尔排序算法,其实是插入排序算法的更高效改进版。该算法因 D.L.Shell 于 1959 年提出而得名。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
希尔排序的基本思想是:
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
希尔排序算法的原理,我们用图来解说。
一个未排序的数组,10 个元素,如下:
我们先用 N/2 =5 作为步长,将数据分为 5 组:
对每组数据进行直接插入排序:
然后再将步长/2, 作为新的步长,进行数据分组:
对每组数据进行直接插入排序:
然后再将步长/2, 作为新的步长,进行数据分组(此时 step 等于 1,是最后一次了):
最后再应用一次直接插入排序,整个数组就排好序了:
以上,就是希尔排序算法的图解说明。
用程序实现时,对每个数据分组进行直接插入排序时,我们可以把多个分组排序合并在一起,用一次循环就把多个分组都排好序。具体思路为:
从下标等于 step 的元素开始,一直到整个数组的最后一个元素,对每个元素,从后向数组头部方向进行查找,用直接插入法将其插入到所在数据分组的合适位置。同一个分组的元素,是与其距离为-step、-2*step、-3*step...的元素。
希尔排序算法的C 语言实现代码,如下:
我的微信号是 实力程序员,欢迎大家转发至朋友圈,分享给更多的朋友。
版权声明: 本文为 InfoQ 作者【实力程序员】的原创文章。
原文链接:【http://xie.infoq.cn/article/876e8aaa11e4567e31f72c876】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论 (1 条评论)