希尔排序是插入排序的一种更高效的改进版本。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 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. WMI技术介绍和应用——WMI概述
  2. 直博清华的小姐姐!本科就发表了SCI,享受朝九晚五的学习生活,做自己的小太阳!...
  3. 168 Excel Sheet Column Title
  4. 关于Android 构建
  5. 反向代理服务器(Reverse Proxy)
  6. 计算机自动启动无法开机,为何插上电源 电脑会自动开机 但是又开不起来
  7. ios 字符串转数组_ES6中常用的数组操作-必须收藏
  8. Drainage Ditches - poj 1273(网络流模板)
  9. cuda矩阵相乘_cuda初学(1):稀疏矩阵向量乘法(单精度)
  10. vim替换字符串带斜杠_Linux vi/vim最全使用指南
  11. java 金额_货币金额的计算 - Java中的BigDecimal
  12. php中echo和print的区别
  13. 【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题【含Matlab源码 334期】
  14. Google Earth 嵌入Qt应用程序
  15. 《西方哲学史》阅读笔记
  16. 看傲腾配OpenCAS加速联通沃云业务
  17. JavaScript有关this指向问题,如何修改this指向
  18. 大连埃森哲Java面试题
  19. 超详细!Vue-coderwhy个人学习笔记(二)(Day3)
  20. JXTA技术与应用发展

热门文章

  1. 掉价最快的手机排行榜_目前掉价最快的三款华为麒麟980旗舰机,最低仅2799元...
  2. java 模拟键盘输入_Java 在windows 下模拟鼠标键盘的输入
  3. android qq密码,怎么用手机改qq密码
  4. 在线计算机励志文案,励志文案短句 适合发朋友圈的正能量语录
  5. c# windows窗体 显示pdf ChromiumWebBrowser插件
  6. Android开发之MVVM模式实践(六),2021字节跳动春招技术面试题
  7. 2022-2027年中国机械键盘行业市场深度分析及投资战略规划报告
  8. 360浏览器安装扩展程序
  9. AutowareAuto泊车案例复现及原理简介
  10. 能听懂口音的开源语音系统来了:OpenAI出品,支持99种语言,英文识别能力直逼人类...