希尔排序(C语言)

希尔排序

在这里插入图片描述
#千锋物联网逆战班#
不肯下一点功夫,永远不会明白自己从何而来,又将立足于何处。

希尔排序是插入排序的一种,又称“缩小增量排序”,希尔排序是直接插入排序算法的一种更高效的改进版本
在这里插入图片描述在这里插入图片描述

1、希尔排序的基本思想:

设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为n/increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序,然后缩小间隔increment,重复上述子序列划分和排序工作,直到最后取increment=1,将所有元素放在同一个子序列中排序为止,该方法实质上是一种分组插入方法

2、关于增量(increment)的取值

希尔排序的复杂度和增量序列是相关的,一般的初次取序列长度的一半为增量,以后每次减半,直到增量为1,希尔排序中对于增量序列的选择十分重要,直接影响到希尔排序的性能,一些经过优化的增量序列如Hibbard经过复杂证明可使得最坏时间复杂度为O(n3/2)

{1,2,4,8,…}这种序列并不是很好的增量序列,使用这个增量序列的时间复杂度(最坏情形)是O(n^2)

Hibbard提出了另一个增量序列{1,3,7,…,2k-1},这种序列的时间复杂度(最坏情形)为O(n1.5)

Sedgewick提出了几种增量序列,其最坏情形运行时间为O(n^1.3),其中最好的一个序列是{1,5,19,41,109,…}

3、代码实现

/* 希尔排序*/
void shellSort(int arr[],int length) {
    //增量计算,计算间隔
    int gap = length/3 + 1;
    while (gap > 0) {
        for (int i = gap; i<length; i++) {
            int tmp = arr[i];
            int j = i-gap;
            if (j >= 0 && arr[j] > tmp) {
                arr[j+gap] = arr[j];
                j-=gap;
            }
            arr[j+gap] = tmp;
        }
        if (gap == 1) { break; }
        gap = gap/3 + 1;
    }
}

5、动画演示

在这里插入图片描述
计算增量:gap = length/3 + 1,自己可以查阅为什么是 除以3(除以3交换的次数最少,时间用的最少)

第一次:gap = 4,把待排序列划分为4个子序列
在这里插入图片描述
第二次 :gap = 2,把待排序列划分为2个子序列
在这里插入图片描述
第三次:gap = 1,进行一次直接插入排序,排序结束

排序结果:

在这里插入图片描述

在这里插入图片描述

发布了52 篇原创文章 · 获赞 42 · 访问量 4961

猜你喜欢

转载自blog.csdn.net/weixin_43288201/article/details/104887929