华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序。如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作)。

看到了这个,我想试试希尔排序,就学学。

一.理论准备

希尔排序(Shell Sort)是插入排序的一种,是针对直接插入排序算法的改进,是将整个无序列分割成若干小的子序列分别进行插入排序,希尔排序并不稳定。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2

希尔排序的时间性能优于直接插入排序的原因:

①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。

②当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。

③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。

因此,希尔排序在效率上较直接插人排序有较大的改进。

增量序列的选择:Shell排序的执行时间依赖于增量序列。

好的增量序列的共同特征(查到的资料都这么讲):

① 最后一个增量必须为1;

② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。

二.Java实现 public class ShellSort {public static void main(String[] args) {int[] arr = new int[]{44,33,99,10,30,20,59,78,23,48};System.out.print("排序前:");for(int o: arr) {System.out.print(o+"");}System.out.println();shellSort(arr);System.out.print("排序后:");for(int o: arr) {System.out.print(o+"");}System.out.println();}private static void shellSort(int[] arr) {int j;int len = arr.length;for(int val=len>>1; val>0; val>>=1) {//下面是对本次的所有分组做直接插入排序for(int i=val; i=val&&temp=val&&temp

三.问题

希尔排序一定正确么?换句话说如何选取增量序列才能保证正确(包括长度、值)?是的,最后一次只要保证增量是1就ok(不管序列长度,只不过效率就低了),若是序列只有1,那就是直接插入排序了,不知道对否。

四.结束语

写完正准备叫老婆去吃饭,隔壁宿舍一哥们过来说大一新生已经攻占食堂了。

希尔排序java写法_Java实现希尔排序相关推荐

  1. 选择排序java代码_JAVA简单选择排序算法原理及实现

    简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...

  2. 希尔排序java写法_java高级排序之希尔排序

    希尔排序对于多达几千个数据项的,中等大小规模的数组排序表现良好,希尔排序不像快速排序和其它时间复杂度为o(n*logn)的排序算法那么快,因此,对非常大的文件排序,它不是最优选择,但是希尔排序比选择排 ...

  3. java冒泡排序_JAVA实现经典排序算法(冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序、快速排序)...

    冒泡排序 依次比较相邻的元素,若发现逆顺序,则交换.小的向前换,大的向后换,本次循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,说明每个元素都不比它后面的元素大,至此排序完成. import ...

  4. java解码_Java数组已排序解码

    java解码 排序是我们在计算机科学中学习的第一个算法. 排序是一个非常有趣的领域,它有大约20多种算法,而且总是很难确定哪种算法最好. 排序算法的效率是根据占用的时间和所需的空间来衡量的. 一些时间 ...

  5. java位图_Java 位图法排序的使用方法

    java JDK里面容器类的排序算法使用的主要是插入排序和归并排序,可能不同版本的实现有所不同,关键代码如下: /** * Performs a sort on the section of the ...

  6. java 实现中文排序,Java自定义比较器实现中文排序

    compareTo 方法 compareTo()是两个字符串对象比较大小,返回一个整数值,如果调用字符串对象大,返回正整数,反之,返回负整数.相等则返回0.compareTo()是两个字符串对象按AS ...

  7. java代码_Java 代码实现排序算法

       阅读本文约需要8分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...

  8. java排序算法对比_java项目 实现排序算法对比,步骤,改进

    前言 发现是时候总结一番算法,基本类型的增删改查的性能对比,集合的串并性能的特性,死记太傻了,所以还是写在代码里,NO BB,SHOW ME THE CODE! github地址:https://gi ...

  9. datatable java排序,Java实现DataTable的过滤,排序,聚合功能

    用过C#的知道, 在.net环境下的有个DataTable对象,数据处理非常方便和强大. 可惜Java本身并没有提供这样的类. 在monalisa-db中提供了一个Java版本的DataTable,  ...

最新文章

  1. 从深度学习到深度森林方法(Python)
  2. linux下清理信号量,Linux下kill的信号量列表
  3. Mysql Explain 详解
  4. 【2018.4.21】模拟赛之三-ssl2404 上学【深度优先搜索】
  5. 邓公数据结构C++语言版学习笔记1
  6. 为什么用Spring来管理Hibernate?
  7. cdh mysql sqoop 驱动_大数据技术之Sqoop学习——原理、安装、使用案例、常用命令...
  8. 《Webservice的应用与开发》学习笔记 ·001【Web服务、XML文档】
  9. IS-IS详解(四)——IS-IS Hello报文详解
  10. 报错Could not resolve resource location pattern [classpath:com/yh/mapping/*.xml]
  11. js 编译emoji表情
  12. EEMD、EMD去噪原理
  13. 华硕笔记本显示服务器不可用,华硕笔记本电脑开不了热点咋办
  14. eclipse豆沙绿设置(一些其他的编辑器也变成豆沙绿)
  15. java佳沃贴吧,十年沉淀 — 2019“JAVA(佳沃)杯”第十届凤凰山山地自行车挑战赛...
  16. TCP三次握手中SYN,ACK,seq ack的含义
  17. wps表格宏被禁用如何解禁_(wps表格怎么设置宏)为什么每次打开excel文件都要提示启用或者禁用宏?...
  18. [导入]剿杀diskman.exe木马病毒
  19. [java]已知文件 source.txt 中的内容如下,其中,username、yonghu 都表示用户名,password、mima都表示密码,level、dengji都表示等级
  20. 你有 10 年经验,为何还是败给只有 1 年经验的? | 程序员有话说

热门文章

  1. Web前端与移动开发学习路线图
  2. sichost.exe,winxphelp.exe,360up.exe,RavNT.exe,Counter.exe,login.jpg.exe等1
  3. Y86-64的顺序实现
  4. SQL Sever查询语句集锦
  5. 行车记录仪专用语音识别芯片AT6802ABR1
  6. 【ceph】开发人员指南--编辑中
  7. 网络防火墙和病毒防火墙的差别
  8. PHP后门隐藏与维持技巧
  9. 运算符(%、/),Scanner类、boolean的使用以及购物单计算
  10. 身份证的正确使用方法——很重要的知识(转贴)