一、希尔排序简述和基本思想

  希尔排序也称递减增量排序算法,是插入排序的一种更高效的改进版本。但是希尔排序是非稳定排序的算法。希尔排序比一般插入排序有以下几点改进:

  • 一般插入排序每次只能将数据移动一位,而希尔排序是按照步长移动的(步长=数组长度/2),步长是递减的。
  • 希尔排序是通过多次划分子序列,对子序列进行排序,使得整个序列基本有序,再对整个序列的所有元素进行直接插入排序,提高了最后直接插入排序的效率。

  希尔排序的基本思想是:先将整个待排序的序列分割成为若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行依次进行直接插入排序。希尔排序是不稳定排序,希尔排序平均时间复杂度为O(n1.3),最差时间复杂度为O(n2),空间复杂度为O(1)。

二、基本步骤

  1. 将整个序列分成n/2个子序列,即是第k个数跟n/2+k(k<=n/2)个数为一个子序列。
  2. 将分好的子序列用插入排序的方式将各个子序列排好序。
  3. 将整个序列分成n/4个子序列,然后分好的子序列按照插入排序排好序。
  4. 不断执行以上操作,直到子序列数为1,排序完成。

三、案例分析

以序列 1,5,4,30,6,29,5,20为例

第一趟排序:子序列数=n/2=4  四个子序列为{1,6},{5,29},{4,5},{30,20}将这四个序列排序后为{1,5,4,20,6,29,5,30}。

第二趟排序:子序列数=n/4=2  二个子序列为{1,4,6,5},{5,20,29,30}将这二个序列排序后为{1,5,4,20,5,29,6,30}。

第二趟排序:子序列数=n/8=1  一个子序列为{1,4,6,5 ,5,20,29,30}将这一个序列排序后为{1,4,5,5,6,20,29,30}。

四、代码展示

public class JavaSort {
public static void main(String[] args) {
int a [] =new int []{1,5,4,30,6,29,5,20};
System.out.println("排序前的数组:"+Arrays.toString(a));
shellSort(a); System.out.println("排序后的数组:"+Arrays.toString(a));
}
/**
*
* @param ary要排序的数组
* @return 返回排序好的数组
*/
public static int [] shellSort(int [] ary) {
int len=ary.length;
for (int num= len/2; num>=1; num=num/2) {//num为子序列数,num也表示子序列元素在原来序列中相差的位置
//找到子序列,子序列用插入排序进行排序
for (int i = num; i < len; i++) {
int j=i-num;//子序列元素要插入的位置
int temp=ary[i];//子序列要插入的元素值暂存
while(j>0&&temp<ary[j]) {//将要插入元素子序列元素比较找到要插入元素的位置
ary[j+num]=ary[j];
j=j-num;
}
ary[j+num]=temp;//插入要插入的子序列元素 }
}
return ary; }
}

运行结果:

java方式实现希尔排序的更多相关文章

  1. 几种排序方式的java实现(02:希尔排序,归并排序,堆排序)

    代码(部分为别人代码): 1.希尔排序(ShellSort) /* * 希尔排序:先取一个小于n的整数d1作为第一个增量, * 把文件的全部记录分成(n除以d1)个组.所有距离为d1的倍数的记录放在同 ...

  2. 算法-java代码实现希尔排序

    希尔排序 第8节 希尔排序练习题 对于一个int数组,请编写一个希尔排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素小于等于2000. 测试样例: [1,2 ...

  3. 常用算法Java实现之希尔排序

    希尔排序严格来说是基于插入排序的思想,又被称为缩小增量排序. 具体流程如下: 1.将包含n个元素的数组,分成n/2个数组序列,第一个数据和第n/2+1个数据为一对... 2.对每对数据进行比较和交换, ...

  4. 排序算法Java实现(希尔排序)

    算法描述:先将待排序序列的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序序列“基本有序”后,再对所有元素进行一次直接插入排序. packa ...

  5. java方式实现选择排序

    一.基本思想 每一趟找到未排序序列的最小(大)值,把它存放在已排序序列末尾,直到把所有的数据排序完,即是第k趟找到剩余未排序数据的最小(大)值,然后把这个最小(大)值存放在数组的第k(k=1,2... ...

  6. java希尔排序

    java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...

  7. java排序算法之希尔排序

    希尔排序是冲破二次时间屏障的第一批算法之一. 它是通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到最后一趟(比较相邻元素)为止.因此希尔排序也叫缩减增量排序. 希尔排序使 ...

  8. 希尔排序java

    希尔排序简述 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率.(希尔排序先将部分数据进行排序,相当于已经部分排好序) ...

  9. 希尔排序----java实现

    思路:希尔排序是分组基础上的直接插入排序,给定的一个步长数组,每个小组先直接插入排序.虽然有四次循环,但是每次循环次数少. package com.sheepmu.text; import java. ...

随机推荐

  1. 使用Python+TensorFlow2构建基于卷积神经网络(CNN)的ECG心电信号识别分类(二)

    心律失常数据库 目前,国际上公认的标准数据库包含四个,分别为美国麻省理工学院提供的MIT-BIH(Massachusetts Institute of Technology-Beth Israel H ...

  2. 说一说Web开发中两种常用的分层架构及其对应的代码模型

    昨天妹子让我帮她解决个问题,本以为可以轻松搞定,但是打开他们项目的一瞬间,我头皮发麻.本身功能不多的一个小项目,解决方案里竟然有几十个类库.仅仅搞明白各个类库的作用,代码层次之间的引用关系就花了一个多 ...

  3. 为什么要学习微信小程序直播开发?最新的小程序直播介绍和优势分析!

    小程序直播的介绍 “小程序直播”是微信提供给开发者的实时视频直播工具,包括直播管理端.主播端和观众端等模块,支持提供常用的用户互动和营销促销工具. 开发者只需在小程序中引入相关代码并在管理后台完成配置 ...

  4. 文件相关命令(find,tree,tar)文件属性信息 date

    6.13day11 文件相关命令(find,tree,tar)文件属性信息date 1 文件相关命令 1.1 find命令 查找文件用f find /root -type f -name " ...

  5. Linux下3种常用的网络测速工具

    大家好,我是良许. 不管你用的是什么操作系统,网速都是你非常关心的一个性能指标,毕竟,谁都不想看个视频结果网速卡到你怀疑人生.本文介绍三个 Linux 命令行下的网络测速工具,让你随时随地知道你的网络 ...

  6. ASP.Net Core中使用Swagger

    我们先简单介绍下什么是Swagger,主要是用来干嘛?? 在Swagger诞生之前,我们通常在开发接口的过程中,需要前后端共同维护一个接口文档,然后大家按照接口文档的规范进行对接.接口文档俨然成了接口 ...

  7. Python求差集

    本月月初在职员工表(20来列,身份证.银行卡号等),本月离职员工表(10来列,计时.计件等),不考虑本月入职员工表,求下月月初在职员工表. Python,import pandas as pd,两个p ...

  8. MySQL 主从复制原理及过程讲解

    mysql主从原理描述,摘自老男孩. 下面简 单描述下 MySQL Replication 复制的原理及过程 . 1.在 Slave 服务器上执行 start slave 命令开启主从复制开关,主从复 ...

  9. [hdu1085]生成函数

    题意:给a个1.b个2.c个5,求不能构成最小的数 思路: 先求1能构成的所有数,2能构成的所有数,5能构成的所有数,它们的方法数显然都是1,现在考虑把3者结合在一起,由于结果为和的形式,而又是循环加 ...

  10. 自动扫雷 python

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. // 2018.8.10更新 代码已上传至GitHub https://gith ...