shell

shell(希尔)排序简要讲解

在学习一个算法以前,我们先了解一下这个算法的一些历史发展。
​ 现在,我要讲解的算法叫希尔排序(Shell Sort)。希尔排序是 D.L.Shell 于1959年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是O(n^2)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。

​ shell排序是基于直接插入排序改进的,所以在学习shel排序l算法以前先去学习了解直接插入排序算法,这样可以更好的理解shell 排序算法

​ 直接插入排序的思想是:构建一个有序的序列,把新的数字插入到有序序列当中。直接插入排序到问题在于:每次插入都会移动大量空间,造成时间复杂度过大。直接插入排序到时间复杂度为O(n^2)。

​ shell排序基于直接插入排序改进:把整个序列分割为多个部分进行插入排序,然后再进行子序列合起来,再进行直接插入排序;这样,减少移动空间次数。直接插入排序的平均时间复杂度O(n1.3);最坏的时间复杂度为O(n2)。

下面是算法实现的简单c语言代码

void shellsort(sqlist_t *L)
{
    int i,j;
    int increment=L->last+1;
    do
    {
        increment=increment/3+1;//每轮比较间隔,也叫增量序列
        for(i=increment;i<=L->last;i//i的起始位置以及结束条件需要符合你传入的L这个顺序表
        {
            if(L->data[i]<L->data[i-increment])
            {  
                int temp=L->data[i];//将data[i]的位置空出来,将值暂存在temp中
                //j的结束位置需要符合你传入的L这个顺序表
                for(j=i-increment;j>=0&&L->data[j]>temp;j-=increment)
                {
                    L->data[j+increment]=L->data[j];
                }
                L->data[j+increment]=temp;
            }
        }
    }while(increment>1);
    return ;
}
/*
结构体sqlist_t如下
typedef int data_t;
typedef struct
{
	data_t data[MAXSIZE];
    int last=-1;
}sqlist_t;
*/

文章最后:这是来自一个正在学习的新码农,如有错误,望指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值