一、动图演示

二、思路分析希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。

而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。

来看下希尔排序的基本步骤,在此选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处做示例使用希尔增量。

三、复杂度分析

1.  时间复杂度:最坏情况下,每两个数都要比较并交换一次,则最坏情况下的时间复杂度为O(n2), 最好情况下,数组是有序的,不需要交换,只需要比较,则最好情况下的时间复杂度为O(n)。

经大量人研究,希尔排序的平均时间复杂度为O(n1.3)(这个我也不知道咋来的,书上和博客上都这样说,也没找到个具体的依据,,,)。

2.  空间复杂度:希尔排序,只需要一个变量用于两数交换,与n的大小无关,所以空间复杂度为:O(1)。

四、Java 代码如下import java.util.Arrays;

public class shell {

public static void main(String[] args) {

int[] arr = new int[]{10,6,3,8,33,27,66,9,7,88};

shellSort(arr);

System.out.println(Arrays.toString(arr));

}

private static void shellSort(int[] arr) {

int temp;

//控制增量序列,增量序列为1的时候为最后一趟

for (int i = arr.length/2; i >0; i/=2) {

//根据增量序列,找到每组比较序列的最后一个数的位置

for (int j = i; j < arr.length; j ) {

//根据该比较序列的最后一个数的位置,依次向前执行插入排序

for (int k = j-i; k >=0; k-=i) {

if(arr[k]>arr[k i]){

temp = arr[k];

arr[k] = arr[k i];

arr[k i] = temp;

}

}

}

}

}

}来源:http://www.icode9.com/content-3-168701.html

java shell排序_八大排序算法——希尔(shell)排序相关推荐

  1. 排序算法java 简书_史上最全经典排序算法总结(Java实现)

    查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在 ...

  2. 排序算法 | 希尔shell排序,算法的图解、实现、复杂度和稳定性分析

    希尔shell排序 1.希尔排序--定义 2.希尔排序--步骤描述 3.希尔排序--算法实现 4.希尔排序--复杂度.稳定性分析 1.希尔排序--定义 希尔排序按其设计者希尔(Donald Shell ...

  3. c++ 不插入重复元素但也不排序_面试时写不出排序算法?看这篇就够了

    小Hub领读: 本文主要详细讲述常见的八种排序算法的思想.实现以及复杂度.包括冒泡排序.快速排序.插入排序.希尔排序等等,文章讲解非常详细! 作者:静默虚空 https://juejin.im/pos ...

  4. 折半查找的思想及源码_结构与算法(04):排序规则与查找算法

    一.递归算法 递归就是方法自己调用自己,每次调用时传入不同的变量,可以让代码变得简洁.递归算法在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法,递归式方法可以被用于解决很多的计算 ...

  5. mongodb 排序_技术分享 | MongoDB 一次排序超过内存限制的排查

    本文目录: 一.背景 1. 配置参数检查 2. 排序字段是否存在索引 二.测试环境模拟索引对排序的影响 1. 测试环境信息 2. 报错语句的执行计划解释 3. 建立新的组合索引进行测试 三.引申的组合 ...

  6. java红包记录_微信红包算法(java)

    package com.example.ant.common.tools; import java.util.LinkedList; import java.util.List; /** * 描述:红 ...

  7. python sort 多级排序_为什么在python中使用排序功能进行多级排序...

    这篇文章与How do I sort a list of dictionaries by values of the dictionary in Python?不同,我认为无法使用lambda sor ...

  8. vba 自动排序_给VBA字典键值排序,并提取需要的数据

    未知的领域很广.风景很美,不要蜷缩在一小块自认为天堂的世界里.待到暮年时安于自欺欺人,要努力提高自己,学习是一件很辛苦的事.要有一颗充满生机的心,把握现在,这才是进取.机会总在等待中出现,越是有意义的 ...

  9. linux shc shell脚本_使用shc工具加密shell脚本详解

    Shc可以用来对shell脚本进行加密,可以将shell脚本转换为一个可执行的二进制文件.经过shc对shell脚本进行加密后,会同时生成两种个新的文件,一个是加密后的可执行的二进制文件(文件名以.x ...

最新文章

  1. 分库分表架构实践(文末送书)
  2. Python进阶5——切片
  3. 蓝书3.7 欧拉回路
  4. 【报错笔记】MAVEN pom.xml 报错解决方法
  5. 一个人的Scrum之准备工作
  6. centos8离线安装Apache_疯狂Hive之Hivean安装部署与交互方式(一)
  7. VirtualBox 虚拟机迁移-克隆
  8. python 传递任意数量的实参
  9. 台湾骑行环岛攻略(转)
  10. 08cms cecore.cls.php,08CMS 变量覆盖导致getshell 等问题
  11. Google Play镜像站
  12. Linux禁用搜狗输入法的简繁切换快捷键
  13. java多文件代码在线运行网站
  14. 免费的pdf转word工具
  15. android逆向分析so,Android逆向——so反编译分析由浅入深(回帖奖励)
  16. wincc脚本打印斑马打印机条码,斑马打印机接口
  17. Android实战开发——引导页面(ViewPager)篇
  18. 星空的征途:浪潮如何用三个力加速行业AI?
  19. 计算机文档分页怎么办,word文档怎么删除分页符
  20. 航空发动机控制学习笔记(二)

热门文章

  1. 查看提交历史(git log)
  2. Javascript Array对象 sort()方法,记忆方法,方法扩展
  3. 《C++ Primer Plus(第六版)》(30)(第十四章 C++中的代码重用 编程题答案)
  4. MyEclipse打包jar 并加入第三方包
  5. ECSHOP邮件验证后送积分
  6. JavaScript==比较的规则
  7. Eclipse中文显示乱码问题
  8. 计算机大作业visio选题,大作业一 用Visio绘网络结构图
  9. python写一个完整的小程序_写一个python小程序
  10. 宝塔反代默认缓存了html吗,宝塔面板安装 OneList 设置反代