希尔排序是一种插入排序,是对直接插入排序的一种改进,该算法出自于D.L.Shell,因此得名为希尔。Shell排序又名缩小增量排序。

思想

     假设初始序列为n个元素,先取一个小于n的整数d1作为第一个增量,然后将全部元素分为d1组。所有距离为d1的倍数的记录放在同一个组中,先在各个组内进行直接插入排序,然后取第二个增量d2 < d1(d2=d1/2)重复上述的分组和排序动作,直到所取的增量di=1,即所有记录放在同一组中进行直接插入排序为止。 
     注意:一般去d1=n/2,di+1=di/2。如果结果为偶数,则加1,保证di为奇数。

例子

    初始序列为[ 6 3 4 1 5 8]
    第一步: 
         d1=6/2=3,将第一个和第四个比较,进行交换,如图所示。
         
     第二步:
         d2=d1/2=1.5,由于取奇数,所以d2=1;
         
         此时待排序列仍是无序的。
     第三步:
         当执行到d=1时,仍然是无序的,此时进行直接插入排序,直接插入排序不再详细叙述,请看上一篇博客:
 这样希尔排序才是真正的完成。
代码
void shellsort(int number[]) {
int i, j, k, d, t; d = Len / 2; while(d > 0) {
for(k = 0; k < d; k++) {
for(i = k+d; i < Len; i+=gap) {
for(j = i - d; j >= k; j-=d) {
if(number[j] > number[j+d]) {
t = number[j];
number[j]=number[j+d];
number[j+d]=t;
}
else
break;
}
}
}
}

分析

     由上面的例子可以看出,希尔排序的执行时间依赖于增量序列d的选择,由于增量不确定,所以希尔排序是不稳定的排序。其平均时间复杂度是  O(n1.3),最坏情况时间复杂度为 O(n2);空间复杂度为O(1)。
总结:
     经过上述分析之后发现shell排序算法的中心在与找到增量,根据增量来找到两两需要比较和交换的值,最后再进行一次直接插入运算,这样就算是大功告成了。
       



Shell排序——软考(五)的更多相关文章

  1. 直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序

    一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2).空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; ...

  2. 软考类----编码、ASII码等

    淘米2014实习生笔试,今年是淘米第一年招暑期实习生,笔试好大部分考的是软考的题目啊啊啊啊(劳资后悔当年没考软考刷加权),其他是浅而泛的风格,C++,SQL语句,数据结构(哈夫曼树,二叉查找树,栈后缀 ...

  3. 软考论文的六大应对策略V1.0

    软考论文的六大应对策略V1.0 短短2个小时,要写3000字的文章,对习惯了用电脑敲字.办公的IT从业人员而言,难度不小.尤其,大家会提笔忘字.笔者的应试策略,就是勤学苦练,考试前的一个星期,摸清套路 ...

  4. 数据结构与算法之--高级排序:shell排序和快速排序

    高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...

  5. 软考-系统开发与软件project

    关于软件project方面的知识,相信大家都不陌生,软考中这部分知识也是重点考察范围,关于软件project的知识点很的琐碎.我把这部分的知识点分成了五部分,各自是软件project的基础知识.开发管 ...

  6. 软考网络工程师、软件设计师等官方指定教材pdf文件

    软考计算机网络工程师教材pdf 链接:https://pan.baidu.com/s/1-UXeNye414UWYxYRC6bHuA 提取码:5z9w 软考计算机软件设计师第五版pdf 链接:http ...

  7. 基本排序算法——shell排序java实现

    shell排序是对插入排序的一种改进. package basic.sort; import java.util.Arrays; import java.util.Random; public cla ...

  8. 软考之PV操作(同步)

    这几天,陆续有那么三两个同学跟我讨论了一下关于软考上的PV操作的题,吾虽不才,但还是把同学们讲通了,在此,特分享一下自己的思路和想法,愿对大家有点帮助! 下面,我们就通过自己做过的试卷上两道题来分析: ...

  9. 插入排序与shell排序(希尔排序)

    1 .插入排序的过程如同我们平时打扑克牌取牌插入的过程,不断将取出的扑克牌插入已经排好的地方. 插入排序过程初始有序区间大小为1,取出无序区间的首元素,查找有序区间的合适位置,进行插入.不断重复上述过 ...

随机推荐

  1. elasticsearch的数据写入流程及优化

    Elasticsearch 写入流程及优化 一. 集群分片设置:ES一旦创建好索引后,就无法调整分片的设置,而在ES中,一个分片实际上对应一个lucene 索引,而lucene索引的读写会占用很多的系 ...

  2. Postgresql集群解决方案测试报告

    1 测试主体 本次测试的主体有3个,分别为: GreenPlum集群,下文简称为GP Postgres-XC集群,下文简称为XC Postgresql单数据库实例,下文简称为pgsql GP和XC都选 ...

  3. SpringBoot系列教程JPA之delete使用姿势详解

    原文: 190702-SpringBoot系列教程JPA之delete使用姿势详解 常见db中的四个操作curd,前面的几篇博文分别介绍了insert,update,接下来我们看下delete的使用姿 ...

  4. 04 javascirpt基础知识---听课笔记

    1.JavaScript概念 一门客户端脚本语言运行在客户端浏览器中的.每一个浏览器都有JavaScript的解析引擎脚本语言:不需要编译,直接就可以被浏览器解析执行了 * 功能:可以来增强用户和ht ...

  5. [转帖]熬夜变傻有科学依据,人类睡觉时会被“洗脑”,科学家首次拍下全程 | Science

    熬夜变傻有科学依据,人类睡觉时会被“洗脑”,科学家首次拍下全程 | Science https://mp.weixin.qq.com/s/hJeJjh0GSUclcoh3Z6mySQ 关注前沿科技 量 ...

  6. Apache Kafka用例

    1.目标 在我们上一篇Kafka教程中,我们讨论了Kafka Pros and Cons.今天,在这篇Kafka文章中,我们将讨论Apache Kafka用例和Kafka应用程序.Kafka是新数据堆 ...

  7. 删除List集合中的元素你碰到过这样的陷阱吗?

    删除List的三种方式: (1) 普通遍历 : @Test public void testList(){ ArrayList<String> list = new ArrayList&l ...

  8. Python-10-迭代器

    一.定义 1. 迭代的概念 迭代器即迭代的工具,那什么是迭代呢?迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不是迭 ...

  9. ModelSerializer组件

    ModelSerializer组件 一 .DRF模型类序列化器 如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一 ...

  10. Fanuc Cnc 数控系统,PC端下发NC程序到CNC端,现场测试通过。

    1.这几天把FANUC 数据采集(产量,状态,轴负载等),以及NC程序下发封装成独立的dll,方便其它项目调用,自己顺便写了下demo测试,在车间测试了几天,效果很好,完善了许多细节. 2.大概的界面 ...