希尔排序是插入排序的一种更高效的改进版本。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。

希尔排序最关键的是选对增量,关于增量的选择,建议参考:http://zh.wikipedia.org/wiki/希尔排序  中的步长序列。

希尔排序的核心思想是:由一定规则将带排序的长序列切割成多个子序列,子序列进行内部插入排序,如此循环。这个规则就是增量。

package Sort;public class ShellSort {/*** <p>* 是否小于* </p>* @author zhangjunshuai* @date 2015年4月3日 下午4:14:52* @param v* @param w* @return*/private static boolean less(Comparable v,Comparable w){return v.compareTo(w)<0;}/*** <p>* 交换函数* </p>* @author zhangjunshuai* @date 2015年4月3日 下午4:14:32* @param a* @param i* @param j*/private static void exch(Comparable[] a,int i ,int j){Comparable t = a[i];a[i] = a[j];a[j] = t;}/*** <p>* 打印输出* </p>* @author zhangjunshuai* @date 2015年4月3日 下午4:19:03* @param a*/private static void show(Comparable[] a){for(int i = 0; i < a.length; i++){System.out.print(a[i] + " ");}System.out.println();}/*** <p>* 希尔排序* </p>* @author zhangjunshuai* @date 2015年4月8日 下午8:51:28* @param a*/private static void Shell(Comparable[] a){int N = a.length/2;while(N>0){//增量的判断for(int i=0;i<a.length;i++){//开始循环所有数据int M = (a.length-i-1)/N;//计算i后面还有多少Nfor(int j=1;j<=M;j++){//以插入排序的方式排序增量为N的数for(int h = j;h>0;h--){if(less(a[i+h*N],a[i+(h-1)*N]))exch(a,i+h*N,i+(h-1)*N);elseh=-1;}}}System.out.println("--------------增量:"+N);show(a);N =N/2;}}public static void main(String[] args) {Integer[] a = {49,38,65,97,76,13,27,49,55,4};Shell(a);}}

结果:

第一遍内部对比的组合是(颜色相同的组合)

第二遍内部对比的组合是(颜色相同的组合)

第三遍是对相邻的进行插入的排序

参考:

http://bubkoo.com/2014/01/15/sort-algorithm/shell-sort/

奔走在算法的大路上(一)排序之希尔排序相关推荐

  1. 奔走在算法的大路上(一)排序之归并排序

    归并排序(Merge sort)是创建在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 归并操作 归并操作(merge),也叫归并算法 ...

  2. 奔走在算法的大路上(一)排序之插入排序

    插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-pla ...

  3. 奔走在算法的大路上(一)排序之选择排序

    首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换).再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置.如此往复,直到 ...

  4. 《Algorithm算法》笔记:元素排序(2)——希尔排序

    <Algorithm算法>笔记:元素排序(2)--希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...

  5. 排序算法:冒泡排序、插入排序、选择排序、希尔排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...

  6. 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较

    掌握好常用的排序算法,在实际的项目开发中可以节省很多的时间.每一种排序算法在执行的效率上是存在差别的,这些微小的时间差,也许在平常的联系当中感觉不到,但是涉及到数据量比较大或者是在资源比较紧张的系统中 ...

  7. 希尔排序python 简书_排序:希尔排序(算法)

    文 | 莫若吻 (注:如果想更好的理解希尔排序,请先看看我的上一篇博客插入排序,希望会对你有帮助.) 一.简介 希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩 ...

  8. 【数据结构与算法】高级排序(希尔排序、归并排序、快速排序)完整思路,并用代码封装排序函数

    本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...

  9. 【排序算法】冒泡排序|选择排序|插入排序|希尔排序

    文章目录 冒泡排序 选择排序 插入排序 希尔排序 冒泡排序   第一个元素开始向第二个元素比较,若大于则交换位置,不大于则不动.然后第二个元素和第三个元素比较,再然后第三个元素和第四个元素比较-一直比 ...

最新文章

  1. 60秒,我们可以干什么?
  2. linux磁盘写保护怎么修改_mount: /dev/vdb 写保护,将以只读方式挂载
  3. 【十二省联考2019】希望【点边容斥】【换根dp】【长链剖分】【线性数据结构】【回退数据结构】【离线逆元】
  4. (13)Node.js 文件流 缓冲 VS 流
  5. 2019 牛客多校第三场 B Crazy Binary String
  6. phphstudy运行不了网站_传统企业网站运营分析:这些弊端你了解吗
  7. gis与一般计算机应用系统有哪些异同,地理信息系统概论课后习题全部答案 黄杏元著...
  8. 6款好用的ppt制作软件推荐
  9. 最受程序员 欢迎的14个社区
  10. 海康威视高级副总裁毕会娟:全面解读“物信融合数据平台”的功能与业务逻辑... 1
  11. fst 共享后缀_trie、FSA、FST(转)
  12. 并发完全知识点目录--yzy
  13. 入职体检(三甲医院)
  14. vue实现微信网页授权登录
  15. putty生成的密钥导入connectbot
  16. 微信小程序运用云函数调用新闻类API
  17. 目标检测YOLO实战应用案例100讲-基于深度学习的自动驾驶车辆三维目标检测方法研究与应用
  18. USACO-Tea Time
  19. LintCode 5: Kth Largest Element
  20. 操作系统------虚拟存储器 请求分页存储管理方式

热门文章

  1. 豆瓣列表 + 详情 VUE 2.X 初使用 H5 手机预览
  2. 单片机 rs232 c语言,完全手册 51单片机C语言开发详解系列之第8章 串口通讯实战—RS232...
  3. linux02-自动部署、awk/sed/cron/cut/wc/uniq
  4. 分布式存储——GlusterFS
  5. Python里的request库安装
  6. python修改ip地址_怎么更改电脑ip地址?基于 Python 爬虫的ip修改设计与实现
  7. 跟益达学Solr5之索引网络上远程文件
  8. python判断excel表格中的重复值
  9. Oracle decode函数的使用
  10. 【Effective Objective-C 2.0读书笔记】第六章:块(Blocks)和大中枢派发(GCD)