算法说明

希尔排序是插入排序的优化版。

插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度。

希尔排序的目的就是通过一个increment(增量)来对数列分组进行交换排序,最终使数列几乎有序,最后再执行插入排序,统计出结果。

通过increment=n/2, 也就是如果9个数的话,增量为4,2,1。   如果是20个数的话,增量就是10,5,2,1。  当increment为1时,其实对几乎有序的数列进行插入排序啦啦。

时间复杂度

O(n2/3)

空间复杂度

O(1)

代码

使用的是Java

/** 希尔排序*/
public class ShellSort {public static void main(String[] args) {int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3, 8 };ShellSortMethod(arrayData);for (int integer : arrayData) {System.out.print(integer);System.out.print(" ");}}public static void ShellSortMethod(int[] arrayData) {int i, j, temp = 0;int increment = arrayData.length;do {increment = increment / 2;  //增量for (i = increment; i < arrayData.length; i++) {if (arrayData[i] > arrayData[i - increment]) {   //判断是否要进行插入排序temp = arrayData[i];  //将要插入的值存放在临时变量中//这里其实做的就是插入排序,将以增量为步长,往后移动。   //temp > arrayData[j] 这个是要注意的,只会移动比要插入的值小的数字for (j = i - increment; j >= 0 && temp > arrayData[j]; j -= increment) {arrayData[j + increment] = arrayData[j];}arrayData[j + increment] = temp;}}} while (increment > 0);}
}

  

 

结果

9 8 7 6 5 4 3 2 1

Hark的数据结构与算法练习之希尔排序相关推荐

  1. Hark的数据结构与算法练习之锦标赛排序

    算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...

  2. Hark的数据结构与算法练习之圈排序

    算法说明 圈排序是选择排序的一种.其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字.根据比较移动到不需要移动时,就代表一圈结束.最终要进行n-1圈的比较 ...

  3. Hark的数据结构与算法练习之珠排序

    ---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦.  大家看一 ...

  4. Hark的数据结构与算法练习之图书馆排序

    算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...

  5. Hark的数据结构与算法练习之计数排序

    算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定 ...

  6. Hark的数据结构与算法练习之桶排序

    算法说明 桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法. 举个例子简单说一下大家就知道精髓了. 假如对11,4,2,13,22,24,20 进行排序. 那么,我们将4和2放在一起,将1 ...

  7. Hark的数据结构与算法练习之耐心排序

    算法说明 耐心排序是插入排序的一种,至少wikipedia是这么分的. 话说我明白这个算法的实现思路了,但是不明白这么做的意义何在? 如果明白的朋友帮忙留个言说一下,以后如果我明白的话,我会来修改这个 ...

  8. python程序结构有哪几种_Python数据结构与算法(几种排序)小结

    Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...

  9. 数据结构:从插入排序到希尔排序

    数据结构:从插入排序到希尔排序 插入排序 算法思路 每次从无序表中取出第一个元素,将其插入到有序表中的适当位置,使有序表的长度不断加长,完成排序过程. n个待排序的元素由一个有序表和一个无序表组成,开 ...

最新文章

  1. 干货 | 一文搞懂极大似然估计
  2. PChar 类型的又一些用法
  3. Wireshark抓取RTP包,还原语音
  4. 《笨办法学python》6_笨办法学Python 习题 25: 更多更多的练习
  5. 数据库班级字段怎么定义名称_班级名称
  6. HSF服务注册失败,项目启动后,EDAS列表无法发现注册的服务
  7. Linux编译程序源码环境,Linux下对nodejs环境进行源码编译并部署云应用
  8. nologging与append测试
  9. ASUS AURA无法启动问题
  10. 虚拟机用Linux安装软件
  11. vrep小车寻迹代码
  12. 微软官网方法制作win10u盘启动
  13. whith ~ as 用法
  14. 为何你的浏览器不信任GlobalSign签发的HTTPS证书?
  15. 冒泡排序的交换次数 (树状数组)
  16. 恢复微信撤回的图片(不容root,极其简单)
  17. 进程的概念、状态转换和进程控制块
  18. 新手体验 kaggle上的电影评论情感分析
  19. PLC SECS/GEM解决方案,设计与应用
  20. 虚拟森林火场生成及蔓延模拟

热门文章

  1. 李宏毅机器学习课程5~~~分类:逻辑回归
  2. CSS预处理——LESS
  3. C++ 中复杂的声明
  4. jdk1.8以前不建议使用其自带的Base64来加解密
  5. Ubuntu安装并使用sogou输入法
  6. 【BZOJ 4170】 4170: 极光 (CDQ分治)
  7. 201521123110《Java程序设计》第5周学习总结
  8. JavaScript-内存空间
  9. d3.js 制作简单的贪吃蛇
  10. iOS-QQ临时对话、QQ群申请跳转