Shell排序复杂度分析

Shell排序复杂度分析

1.大致思想

可以把希尔排序看作是发牌员,给每人轮流发一张牌。需要给n个人发牌,每人从第二张开始分别进行插入排序,那么第一轮下来后,
每人的牌就是有序的。接下来按照刚刚的发牌顺序把牌再收起来,减少人数,不断重复这个步骤,直到只剩下一个人,那么就是直接
插入排序。

希尔排序可以看作是插入排序的升级版本,通过分组预先插入排序,为后续的插如排序减少循环次数,达到提高效率的目的
简单来说,希尔排序是

  • 按照设置的 gap(<n)值,先将数组分为不同的几组,索引为i+gap*1、i+gap*2、...、i+gap*j(<n)的为一组
  • 对每组进行插入排序
  • 缩小gap值,直至缩小至1,回到第一步
  • 排序完成

2.代码实现

void swap(int*a,int*b){
    int tmp = *a;
    *a=*b;
    *b=tmp;
}

void shell_sort(int *a,int n){
    assert(a);
    for(int gap=n/2;gap>0;gap/=2){
        for(int i=gap;i<n;i++){
            for(int j=1;i-j*gap>-1;j++){
                if(a[i-(j-1)*gap]<a[i-j*gap])
                    swap(&a[i-(j-1)*gap],&a[i-j*gap]);
            }
        }
    }
}

和插入排序相似,从每组第二个元素开始遍历,对本组元素进行插入排序;gap更新后,重复该过程;gap=1时,直接进行
插入排序,最后结束。

复杂度

由于gap设置的差别,shell排序会出现不同的时间复杂度,此处仅分析gap以除以2减小的结果

最优情况:
时间复杂度:O(N)
空间复杂度:O(1)
平均情况:
时间复杂度:O(Nlog_2N)
空间复杂度:O(1)

posted @ 2024-03-09 12:09  刘?  阅读(21)  评论(0编辑  收藏  举报