zoukankan      html  css  js  c++  java
  • 排序算法-(4)-希尔排序

    排序思想:
    先将序列分成较多个子序列分别进行排序,再分成较少个子序列分别进行排序,直到最后为一个序列排序。
    1. 每隔固定距离选取一个数的方法划分子序。其中间隔距离称为增量。每次子序都排好后,增量减半,增量减少意味着子序数减少,直到增量为1,便是全部的数序了,希尔排序完成。
    2. 子序列使用插入排序

    实现步骤:
    选择序列中的某个元素a作为分割标准,那么将序列中小于a的元素放在a的左边,大于a的元素放在右边,然后对两边的序列迭代下去。

    时间复杂度:
    希尔排序的算法复杂度分析可类比快速排序,一般认为希尔排序时间复杂度为:O(nlogn)。

    空间复杂度
    希尔排序的空间复杂度显然为O(1),仅仅需要一个交换变量。相比快速排序递归调用产生的巨大栈消耗,希尔排序O(1)的空间消耗显得十分让人惊喜。

        void ShellSort(int Array[],int n){
            int d=n/2;                   //设置起始增量
            while(d >= 1)
            {               //增量为1时排序结束
                for(int k=0;k<d;k++)
                {    //遍历所有的子序
                    for(int i=k+d;i<n;i+=d)
                    {  //对每个子序进行插入排序
                        int temp=Array[i];   //插入排序算法参见链接
                        int j=i-d;
                        while(j>=k && Array[j]>temp)
                        {
                            Array[j+d]=Array[j];
                            j=j-d;
                        }
                        Array[j+d]=temp;
                    }
                }
                d=d/2;                   //缩小增量
            }
        }
    
  • 相关阅读:
    8u111-jdk-alpine 字体缺少FontConfiguration的NullPointerException错误解决方案
    Mybatis插件原理
    Mybaits 分页
    @requestBody 和@RequestParam
    Mybaits 生产mapper
    powerDesigner 生成SQL时没有注释问题
    HashMap 的 put过程
    Java的锁
    Java1.8 JVM配置 GC日志输出
    Windows 安装两个MYSQL实例
  • 原文地址:https://www.cnblogs.com/tigerson/p/7151738.html
Copyright © 2011-2022 走看看