希尔排序,又称为““缩小增量排序””,他的实质是采用分组插入的方法,将整个数组分为几组,从而减少插入排序的数据量,将每组的两端的元素进行比较,然后交换,然后缩小增量,即重新分组,经过几次缩小增量后,基本达到有序的情况,再对全体进行一次直接插入排序。

代码如下

public void shellInsertSort(int []a,int n) {int gap,i,j,tmp;for(gap = n/2;gap > 0;gap = gap/2) {for(i = gap;i < n;i++) {for(j = i-gap;j >= 0&&(a[j]>a[j+gap]);j = j-gap) {tmp = a[j];a[j] = a[j+gap];a[j+gap] = tmp;}}}for(i = 0;i < a.length;i++) {System.out.println(a[i]);}}

可以画图自己来理解消化

值得欣喜的是,希尔排序的时间复杂度不再是O(n²),但这种跳跃的移动导致排序不稳定,并且只能用于顺序结构,还有就是增量序列的选取,应该使增量序列的值没有除了1之外的公因子,而且最后的增量必须为1。最后,因为他的比较次数和移动次数都比直接插入排序要少,n比较大是,效果越好,所以适用于初始无序,n比较大的情况

转载于:https://www.cnblogs.com/Yintianhao/p/9157410.html

插入排序--希尔排序相关推荐

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

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

  2. 直接插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序的算法分析和具体实现 ...

    排序分为内部排序和外部排序 内部排序是把待排数据元素全部调入内存中进行的排序. 外部排序是因数量太大,把数据元素分批导入内存,排好序后再分批导出到磁盘和磁带外存介质上的排序方法. 比较排序算法优劣的标 ...

  3. 插入排序(折半查找优化插入排序||希尔排序) _清风明月

    插入排序:插入排序分为三个步骤: 1. 找位置.(序列可分为两个部分,第一个部分是有序序列,其二是非有序序列.当为有序序列时,查找可以改进为折半查找,优化算法速度.) 2. 移动. 3. 插入.查找的 ...

  4. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  5. 【排序算法】冒泡排序 选择排序 插入排序 希尔排序(数组)

    冒泡排序 #include<iostream> using namespace std; #define SWAP(a,b) {int tmp;tmp=a;a=b;b=tmp;} int ...

  6. 插入排序 希尔排序 C++

    最优时间复杂度为o(n),又称缩小增量排序. 逻辑分析: 1.希尔排序首先是确定增量,默认的希尔增量(不一定是最优)为length/2. 2.根据增量分组,将分组的元素利用直接插入法排序. 3.增量= ...

  7. 插入排序:直接插入排序希尔排序

    一.直接插入排序 1. 思想 直接排序法, 可以分为两个部分, 一部分是有序的, 一部分是无序的. 从这个图上, 应该是能看清楚直接插入排序的思想了. 将无序部分的第一个与有序部分进行比较. 从有序部 ...

  8. 王道八大排序:直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 归并排序 基数排序

    文章目录 1.插入排序 1.1直接插入排序 1.2折半插入排序 1.3希尔排序 2.交换排序 2.1冒泡排序 2.2快速排序 3.选择排序 3.1简单选择排序 3.2堆排序 4.归并排序 5.基数排序 ...

  9. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

最新文章

  1. 为什么说Python是伟大的入门语言
  2. 计算机软件求职信英文,计算机办公软件英文求职信
  3. jvm:类加载器和类的加载过程
  4. SAP日记之一-漫漫自学路
  5. 解决后退,清空验证码(其它文本框保留)
  6. Error Handling in ASP.NET Core
  7. 2019 6月编程语言_六月开始提供435项免费在线编程和计算机科学课程
  8. oracle数据库中分析函数大全,Oracle数据库的分析函数
  9. 7-2 jmu-Java-02基本语法-05-浮点数的精确计算 (1 分)
  10. 连载一:Oracle迁移文档大全
  11. 软件工程复习笔记 UML
  12. (原)logstash-forwarder + logstash + elasticsearch + kibana
  13. PPT写的好,升职加薪不会少-全套免费教程
  14. SAP中销售订单流程及常用事务 Get the picture
  15. HARK学习(六)--AudioStreamFromWave
  16. 大数据分析的好帮手 Excel函数应用的顶级实战 Excel数据分析应用+VBA实战 24G课程
  17. 产品碳足迹ISO14067认证
  18. 办公逸CTO王斌:提高产品响应速度应注意的二十五个技术细节
  19. android 群英传笔记,Android 群英传读书笔记1
  20. 天津师范大学计算机专业排名,天津最好的10所大学公布:天津师范大学第三,各校就业率相差较大...

热门文章

  1. concurrent(六)同步辅助器CyclicBarrier 源码分析
  2. BZOJ 2788[Poi2012]Festival
  3. 2-4 js基础-事件对象小结
  4. 论项目团队情商与项目团队绩效(转)
  5. 我是如何去了解需求的
  6. 【51nod】2590 持续讨伐
  7. ASP.NET CORE 入门教程(附源码)
  8. sqlserver 查询语句执行历史
  9. Excel的日期格式约定与解析
  10. 在CcentOS系统上将deb包转换为rpm包