希尔排序是一种插入排序,是对直接插入排序的一种改进,该算法出自于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. swoole实战1-初识swoole

    原文地址:https://www.jianshu.com/p/008d5702d01f 安装swoole 以mac操作系统为例,如果你是mac新手,推荐阅读 程序员如何优雅使用mac 环境要求:php ...

  2. qt creator的使用总结

    每一个不曾起舞的日子,都是对生命的辜负----------尼采 1.  HELP功能: 1)有时点击"HELP"之后,对应的页面里没有左侧的搜索栏.比较理想的状态是将左侧导航栏划分 ...

  3. Python-11-生成器

    一.定义 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用__iter__方法),所以生成器就是一种迭代器. 二.生成器的两种形式 1. 生成器函数 使用yield代替r ...

  4. xorm-Iterate/Count/Rows方法实例

    package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/ ...

  5. PB对象Event ID说明

    原地址:https://www.cnblogs.com/nickflyrong/p/5973795.html Event ID 含义 内容浅析 event可以用pb自带的id,自动触发事件,而func ...

  6. go 缓冲IO

    package main import ( "bufio" "fmt" "os" "strings" ) func ma ...

  7. [高清·非影印] Python机器学习经典实例(电子书+源码)

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  8. redis GEO的使用

    一.概念 redis的GEO特性在Redis3.2版本发布,这个功能可以将用户给定的地理位置信息储存起来,并对这些信息进行操作. GEO常用语LBS(Location Based Service),基 ...

  9. 【转载】关于SimpleDateFormat安全的时间格式化线程安全问题

    想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调 ...

  10. NameError: name “ ” is not defined

    NameError: name “ ” is not defined 问题一:name ‘name’ is not defined "name"两端是双下划线"_&quo ...