排序算法之希尔排序

 

本文将介绍排序算法中的希尔排序,它是高级版的插入排序,是我们第一个介绍的有点难度的算法。


1. 实例讲解

希尔排序,是插入排序的一个升级版本。在插入排序中,无论数据是怎么分布的,依然循规蹈矩的一步一步比较,移动,插入。在希尔排序中,采用跳跃式的方式,按照某个增量gap将数组元素分成多组序列,并使用插入排序使得各自组内有序。随后逐步缩小gap,继续按组进行插入排序,直到增量为1。这样做的目的是使得数组整体在宏观上有序,最终只需要微调局部元素就可以完成排序

排序算法之希尔排序_第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 代码解析

排序算法之希尔排序_第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)

你可能感兴趣的:(算法,希尔排序,排序算法)