本文将介绍排序算法中的希尔排序,它是高级版的插入排序,是我们第一个介绍的有点难度的算法。
1 实例讲解
希尔排序,是插入排序的一个升级版本。在插入排序中,无论数据是怎么分布的,依然循规蹈矩的一步一步比较,移动,插入。在希尔排序中,采用跳跃式的方式,按照某个增量gap将数组元素分成多组序列,并使用插入排序使得各自组内有序。随后逐步缩小gap,继续按组进行插入排序,直到增量为1。这样做的目的是使得数组整体在宏观上有序,最终只需要微调局部元素就可以完成排序。
我们有初始数组[4,5,1,10,3,6,9,2]。
第一趟:gap=4(一般初始化为数组长度/2),表示相隔4个位置的元素为一组。此时,a[0]和a[4]、a[1]和a[5]、a[2]和a[6]、a[3]和a[7]为一组,共4组。这一趟的任务就是让这4组元素在组内是有序的。
第二趟:gap=2(每次除以2),表示相隔2个位置的元素为一组。a[0]、a[2]、a[4]、a[6]为一组,a[1]、a[3]、a[5]、a[7]为一组。同样,让这两组元素在组内有序。
第三趟:gap=1,也是最后一趟,表示每隔1个位置的元素为一组,也就是整个数组了。让整个数组有序。
经过了前面两次的“宏观调控”,整个数组已经基本有序,只需要对部分元素进行微调,不会出现对整个数组进行移动的情况。
2 代码解析
从13行到第22行,就是希尔排序的核心。
13行:定义了gap变量,初始化为n/2,每次循环结束后都会除以2,直到gap=1。
15-21行:其实就是插入排序,插入只不过在希尔排序中,j的前一个元素不是j-1,而是j-gap。
如果插入排序不了解的,可以查看往期文章【排序算法之插入排序,玩扑克牌必会】
3 效率分析
希尔排序的分析是一个复杂的问题,它时间复杂度依赖于增量序列,用不同的增量序列,能够得到不一样的时间复杂度。其中O(n^1.3) 是一个比较好的实现。最坏时能够达到O(n^2)