• 排序算法-(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;                   //缩小增量
            }
        }
    
  • 相关阅读:
    mysql远程连接拒绝连接错误
    在C#中mongohelper的初始化
    利用C# 驱动删除mongo中 list中的 某一项
    js如何获得url中的参数
    设置p标签的内容超出部分以省略号替换不起作用
    利用C#序列化和反序列化json
    简单操作excel类
    C# 如何取得汉字的字符长度
    js的一些基本操作
    ThinkPHP5 打开多语言支持
  • 原文地址:https://www.cnblogs.com/tigerson/p/7151738.html
Copyright © 2020-2023  润新知