希尔排序(C语言)

记录学习的第二天,今天看了第二个排序,希尔排序;
在这里插入图片描述
希尔排序嘛,应该就是建立在插入排序基础上的一个优化(应该是这样);
有点对半查找的那种感jiao;
在这里插入图片描述
首先必须先附上纯手工的笔记!
在这里插入图片描述
看着还是有点乱啊,希望以后咱不会了回来能看懂
在这里插入图片描述
先解释一下这个增量序列,用到希尔排序的话,首先要确定的就是它,那怎么确定呢,恩,如上图!
默认情况应该是:
如果序列中有10个元素,就用10/2=5;第一个就是5;
再用5/2=2,第二个就是2;以此类推,直到最后为1结束;
那确定了它有什么用处呢!
在这里插入图片描述
那如图所示,有两个增量为3和1;(重点,两个增量);
那么就确定了比较的趟数(在代码上就确定了最外层循环);
是两趟!

之后就要进行下一步了!
第一趟:
先把这个3给拿过来;
看图看图!在这里插入图片描述
(1)先比较A【x】和A【x-3】,小的去前面,大的在后面;
再让x+1;
(2)再比较A【x】和A【x-3】,小的去前面,大的在后面;
再让x+1;就这么一直到A【x】为序列的最后的一个;

那么这部就完成了,会确定好一个序列;
(注意:这里虽然每个A【x】都只比较了一次,是因为序列比较短,如果长的话比较完A【x-3】还要比较A【x-6】,但是这个序列并不够长。)

第二趟:
再把这个1拿过来;
如图所示。
x此时为1;
(1)拿到A【x】,让A【x】和A【x-1】(注意x-1=0)比较;再排序
x+1;
(2)再让A【x】和A【x-1】还有A【x-2】(这时x-2=0)都进行比较;再排序;
x+1;;

(6)一直到最后A【x】为最后一个元素,排序就完成了;

是不是很眼熟;
在这里插入图片描述
感觉这好像是插入排序啊;
没错,最后增量为1不就是插入排序嘛;然后前面其他的增量不就是把序列分成块进行插入排序嘛!
在这里插入图片描述
因为咱也是刚学,咱的表情也是这样,哈哈!
咳咳,所以等以后咱学业有成了咱再回来补充一下;
在这里插入图片描述
最后再附加一下代码段喽;

void shell(int a[],int n){
int i,j;
int x;//增量序列
int temp;

for(x=n/2;x>0;x/=2){
    for(i=x;i<n;i++){
        temp=a[i];
        for(j=i;j>=x;j-=x){
            if(temp<a[j-x]){
                a[j]=a[j-x];
            }
            else{
                break;
            ![}](https://img-blog.csdnimg.cn/20200501104840686.jpg#pic_center)

        }
        a[j]=temp;
    }
}
}

发现了吧。有三层循环,最外层就是用增量序列的个数确定的;
第二层是每个增量下面的要比较的A【x】(x会一直++直到最后一个元素);
第三层是每个A【x】要比较的元素个数;

在附上测试和运行结果
在这里插入图片描述
ojbk,今天就这样了,结束!
给自己点个赞!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46726346/article/details/105874772