数据结构学习——希尔排序

希尔排序是一种改进的插入排序,通过增量序列逐步减少,使得元素大步移动接近正确位置,最后进行一次直接插入排序。文章介绍了希尔排序的基本思想、步骤、特点以及时间复杂度分析。希尔排序的时间效率与增量序列的选择密切相关,而最佳增量序列至今没有确定的最优解。代码展示了希尔排序的实现过程,包括ShellInsert函数和ShellSort函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本思想:

简单插入排序的改进。先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。


步骤:

  1. 定义增量序列Dk:Dm>Dm-1>...>D1=1
  2. 对每个Dk进行“Dk-间隔”的插入排序(k=M,M-1,...1)

特点:

1.一次移动,移动位置较大,跳跃式地接近排序后的最终位置

2.最后一次只需要少量移动

3.增量序列必须是递减的,最后一个必须是1

4.增量序列应该是互质的,无除1外的公因子

5.不宜在链式存储结构上实现


void ShellInsert(SqList &L,int dk){
     for(i=dk+1;i<=L.length;i++){
           if(r[i].key<r[i-dk].key){
               r[0]=r[i];
               for(j=i-dk;j>0&&(r[0].key<r[j].key);j=j-dk)
                   r[j+dk]=r[j];
               r[j+dk]=r[0];
           }
     }
}
void ShellSort(Sqlist &L,int dlta[],int t){   //dlta是存放增量序列的数组,t是数组大小
     for(k=0;k<t;k++)
        ShellInsert(L,dlta[k]);
}

时间复杂度分析:

希尔排序是不稳定排序,其算法效率与增量序列的取值有关。

目前尚未有一个最好的取增量序列的办法,原始希尔排序的取法是Dm=待排序列长度/2,第i个增量Di=Di+1/2。

Hibbard增量序列的取法:Dk=2^{k}-1

其猜想最坏情况:O(n^{\frac{3}{2}})/O(n^{\frac{7}{6}}

猜想平均情况:O(n^{\frac{5}{4}})/O(n^{\frac{4}{3}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值