首页 > 编程语言 > 详细

希尔排序(Shell Sort)

时间:2020-07-16 15:54:26      阅读:45      评论:0      收藏:0      [点我收藏+]

希尔排序(Shell Sort)

技术分享图片

先追求表中的部分元素有序,再逐渐逼近全局有序

定义和操作步骤

先将待排序表分割成若干行形如L[i,i+d,i+2d,...,i+kd]的“特殊”子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止

技术分享图片

把相对的位置的大小顺序不对的对调。

技术分享图片

第二趟把增量d缩小,对每个子表进行直接插入排序

技术分享图片

技术分享图片

第三趟的时候,d已经变成1了,相当于对表进行操作。

整个表已呈现出“基本有序”,对整体在进行一次“直接插入排序”

技术分享图片

技术分享图片

考试中可能会遇到各种增量。判断当时序列的状态。

代码

//希尔排序
void ShellSort(int A[],int n){
    int d,i,j;
    //A[0]只是暂存单元,不是哨兵,当j<=0时,插入位置已到
    for(d=n/2;d>=1;d=d/2)		//步长变化
        for(i=d+1;i<=n;++i)
            if(A[i]<A[i-d]){	//需将A[i]插入有序增量子表
                A[0]=A[i];		//暂存在A[0]
                for(j=i-d;j>0&&A[0]<A[j];j-=d)
                    A[j+d]=A[j];//记录后移,查找插入的位置
                A[j+d]=A[0];	//插入
            }
}

尝试实现直接处理完一个子表的

算法性能分析

空间复杂度:O(1)

时间复杂度:和增量序列d1,。。。的选择有关,目前无法用数学手段证明确切的时间复杂度

最坏时间复杂度为O(n^2),当n在某个范围内时,可以达到O(n^1.3)

稳定性

技术分享图片

不稳定。

适用性:仅适用于顺序表,不适用于链表

知识回顾

技术分享图片

希尔排序(Shell Sort)

原文:https://www.cnblogs.com/jev-0987/p/13322145.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!