接着上一篇博客,这篇要介绍的是希尔排序(缩小增量排序法)。

希尔排序:通过比较相距一定间隔的元素来工作;各趟比较所用的距离(增量)随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。是插入排序的一种,是针对直接插入排序算法的改进。

算法思想:先将要排序的序列按某个增量d分成若干个子序列,对每个子序列中全部元素分别进行直接插入排序,然后再用一个较小的增量对它进行分组,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。注意:增量的取值——一般的初次取序列的一半为增量,以后每次减半,直到增量为1。

算法实现代码如下:

package exp_sort;public class ShellSort {public static void shell(int array[]) {int j;int average;//设置增量的值for (average = array.length / 2; average > 0; average /= 2) {  //步长for (int i = average; i < array.length; i++) { //子序列进行直接插入排序int temp = array[i];for (j = i; j >= average && temp < array[j - average]; j -= average) {array[j] = array[j - average];}array[j] = temp;}}for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}System.out.println("\n");}public static void main(String[] args) {// TODO Auto-generated method stubint array[] = { 38, 62, 35, 77, 55, 14, 35, 98 };shell(array);}}

算法分析:该算法是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比O(n^2)好一些,为 O(n^1.5),排序 效率比插入排序高很多。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是 不稳定的。希尔排序没有快速排序算法快 O(N*(logN)),因此对 中等大小规模的数据排序比较适用,对规模非常大的数据排序不是最优选择。但是比O(N^2)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。

数据结构排序系列详解之二 希尔排序相关推荐

  1. 数据结构排序系列详解之六 树形选择排序

    这篇博客接着来说说选择类排序之一的排序:树形选择排序 在简单选择排序中,每次的比较都没有用到上次比较的结果,所以比较操作的时间复杂度是O(N^2),想要降低比较的次数,则需要把比较过程中的大小关系保存 ...

  2. 数据结构排序系列详解之五 简单选择排序

    在前面的博客中已经讲述了交换类的排序算法,这节中开始说说选择类的排序算法了,首先来看一下选择排序的算法思想: 选择排序的基本算法思想: 每一趟在 n-i+1 (i=1,2,3,--,n-1)个记录中选 ...

  3. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  4. 七大排序算法—图文详解(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

    作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 目录 插入排序: ...

  5. 数据结构排序系列详解之一 插入排序

    复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. 排序 1.概念: 有n个记录的序列{R1,R2,.......,Rn}(此处注意 ...

  6. 十大经典排序算法详解(一)冒泡排序,选择排序,插入排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 目录 1.算法的评判标准 2.排序算法的分类 3.十大经典排序算法-冒泡排序,选择排序,插入排序 ...

  7. 数据结构排序系列详解之七 归并排序

    在前面说的那几种排序都是将一组记录按关键字大小排成一个有序的序列,而归并排序的思想是:基于合并,将两个或两个以上有序表合并成一个新的有序表 归并排序算法:假设初始序列含有n个记录,首先将这n个记录看成 ...

  8. 数据结构排序系列详解之四 快速排序

    交换类排序的另一个方法,即快速排序. 快速排序:改变了冒泡排序中一次交换仅能消除一个逆序的局限性,是冒泡排序的一种改进:实现了一次交换可消除多个逆序.通过一趟排序将要排序的数据分割成独立的两部分,其中 ...

  9. 数据结构排序系列详解之三 冒泡排序

    前面两篇博客讲述的排序算法都是基于插入类的排序,这篇文章开始介绍交换类的排序算法,即:冒泡排序.快速排序(冒泡排序的改进). 交换类的算法:通过交换逆序元素进行排序的方法. 冒泡排序:反复扫描待排序记 ...

最新文章

  1. cache目录没有权限
  2. 怎么打包图片_超简单的免费批量图片压缩技巧,只需3步
  3. 免费设计图标的网站;免费设计的网站;免费设计的网站;
  4. oracle dba_waiters中的lockid是什么,查杀oracle lock session and table
  5. 小程序开发配置接口域名提示:不在以下 request 合法域名列表中,请参考文档
  6. 精锐教育创始人张熙辞任CEO 李晓明接任
  7. aop java 接口_Spring AOP实现接口验签
  8. 提升R代码运算效率的11个实用方法——并行、效率
  9. 在Ubuntu下搭建Spark群集
  10. ESB 分布式处理技术 Remoting
  11. 手机手写签名 php,jSignature手写签名
  12. 解读SPSS多元方差分析中的多因素多变量的相互影响
  13. 5v继电器模块实物接线_5v继电器的工作原理
  14. 计算机桌面有扫描图标如何开始扫,如何正确使用扫描仪 扫描仪的使用方法详解【图文详解】...
  15. Pomodoro技术的失败如何使我成为2倍更好的程序员
  16. matlab示波器横轴变纵轴,excel表格横轴数据变纵轴-在EXCEL中做图表,横坐标和纵坐标如何调换?...
  17. 王爽 汇编语言 实验全部答案
  18. 大文件如何传输,大文件的传输方式有哪些?
  19. 生产物流系统建模与仿真-基于WITNESS建模视频教程
  20. 教你使用python做一段魔性的音乐

热门文章

  1. ASP.NET中使用多个runat=server form(转)
  2. 华为机试HJ68:成绩排序
  3. etl 不能转换成date_java怎么将date类型转换成datetime类型
  4. 小程序 背景图 repeat_简单可爱的微信聊天背景图片
  5. 无法在此设备上查看受保护内容_细说丨你想要的Excel保护与加密都在这里
  6. Excel显示完整的年月日乱码解决方法
  7. PHP中select框不同用户登录,首页登录后怎么在首页显示用户名以及隐藏登录框?...
  8. Linux服务器查看日志方法小结
  9. python读取matlab数据_详解如何在python中读写和存储matlab的数据文件(*.mat)
  10. html烟火源码,HTML5:烟火