shell(希尔)排序和插入排序简介

插入排序 :
考虑这样一种情况: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序.
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

希尔排序 :希尔排序是把记录按下标的一定增量分组(n/2=a,增量为a),对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止.
是对插入排序的一个改进,是非稳定排序算法

比如{3,1,5,9,6,5,0,2,4,12}数列

我们首先设增量为5(n/2=5)(n为数列长度), 故将原数列中第i位和第i+5位进行插入排序 《shell(希尔)排序和插入排序简介》
初步排序结果为{3,0,2,4,6,5,1,5,9,12}。然后再将增量逐渐减小,进行5/2=2的分块,即{3,2,6,1,9},{0,4,5,5,12},排序得{1,0,2,4,3,5,6,5,9,12},最终进行2/2=1分块,即对上数列直接进行插入排序得到最终序列{0,1,2,3,4,5,5,6,9,12}。
《shell(希尔)排序和插入排序简介》

摘自其他文章:
Shell排序的执行时间依赖于增量序列。
好的增量序列的共同特征:
① 最后一个增量必须为1;
② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。
有人通过大量的实验,给出了目前较好的结果:当n较大时,比较和移动的次数约在n到1.6n之间。

点赞