• 【算法】希尔排序


    算法-希尔排序


    前置知识

    思路

    此算法比任何其他排序算法都要鬼畜!请做好心理准备
    我们现在有一个序列,怎么对它排序?
    这是一个非常经典的问题,这里我们使用一个经典的鬼畜算法——希尔排序解决。

    这里有一个序列,要对它升序排序(为便于取 gap \text{gap} gap,大小取 8 8 8)。
    4 8 1 5 3 2 7 6

    48153276" role="presentation" style="position: relative;">48153276
    48153276
    然后取 gap = n 2 = 4 \text{gap}=\frac n 2=4 gap=2n=4,将相距等于 gap \text{gap} gap 的两个元素分为一组,此处将不同组使用不同颜色标出
    4 8 1 5 3 2 7 6
    48153276" role="presentation" style="position: relative;">48153276
    48153276

    然后在每一组内进行排序(此时可自选一种其他排序,建议选取对较有序序列友好的算法。你要是直接启发式合并他不就变成归并了吗
    3 2 1 5 4 8 7 6
    32154876" role="presentation" style="position: relative;">32154876
    32154876

    gap \text{gap} gap 减半,重新分组
    3 2 1 5 4 8 7 6
    32154876" role="presentation" style="position: relative;">32154876
    32154876

    继续操作,直至 gap \text{gap} gap 降为 1 1 1,即只剩下一组
    1 2 3 5 4 6 7 8
    12354678" role="presentation" style="position: relative;">12354678
    12354678

    1 2 3 5 4 6 7 8
    12354678" role="presentation" style="position: relative;">12354678
    12354678

    1 2 3 4 5 6 7 8
    12345678" role="presentation" style="position: relative;">12345678
    12345678


    算法参数
    • 平均时间复杂度: O ( n 1.3 ) O(n^{1.3}) O(n1.3)
    • 最好时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
    • 最坏时间复杂度: O ( n 2 ) O(n^2) O(n2)
    • 空间复杂度:取决于选取的辅助排序算法
    • 注:以上时间复杂度不准确,实际复杂度取决于 gap \text{gap} gap,目前无法准确求解

    实现代码

    此处使用插入排序作为辅助排序

    void InsertionSort(int a[],int n,int x,int gap){
    	int tmp=a[i],j;
    	for (j=x;j>=gap&&a[j-gap]>tmp;j-=gap)
    		a[j]=a[j-gap];
    	a[j]=tmp;
    }
    void ShellSort(int a[],int n){
    	for (int gap=n/2;gap>=1;gap/=2)
        	for (int i=1;i<gap;i++)
            	InsertionSort(a,n,x,gap);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    练习
  • 相关阅读:
    jQuery 学习笔记
    es_04
    基于 Keras 的图像分类器
    用OLED屏幕播放视频(2): 为OLED屏幕开发I2C驱动
    产品经理就业喜报:念念不忘,必有回响
    【C++从0到王者】第三十七站:模拟unordered_map和unordered_set
    海外众筹运营
    【C++智能指针】智能指针的发展和循环引用的原理和解决
    AlphaTensor论文阅读分析
    Linux系统编程——文件的打开及创建
  • 原文地址:https://blog.csdn.net/zhouyh2011/article/details/134423617