排序算法-(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;                   //缩小增量
        }
    }
posted @ 2017-07-11 17:36  老虎养的小牛犊  阅读(212)  评论(0编辑  收藏  举报