希尔排序是冲破二次时间屏障的第一批算法之一。

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

希尔排序使用一个序列h1,h2,h3...hk来排序。

具体的意思是

第一趟排序比较的是相隔为hk的元素,也就是比较a[i]与a[i+hk],保证a[i]<=a[i+hk]。

第二次比较的是相隔为hk-1的元素,也就是比较a[i]与a[i+hk-1],保证a[i]<=a[i+hk-1]。

直到最后比较的是相隔之间为h1的元素。.

因此这个序列也叫增量序列,这个排序算法也叫缩减增量排序

只要h1等与1,任何增量序列都是可以的。(也就是最后一定是比较相邻之间的元素)

具体看一下java的算法实现:

package k;

import java.util.Scanner;
/**
* 希尔排序
* @author TangZH
*
*/
public class ShellSort { public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
String str[]=in.nextLine().split("\\s+"); int inter[]=new int[str.length]; for(int i=0;i<str.length;i++)
{
inter[i]=Integer.valueOf(str[i]);
} ShellSort(inter); outPut(inter);
} /**
* 希尔排序
* @param inter
*/
private static void ShellSort(int inter[])
{
for(int gap=inter.length/2;gap>0;gap/=2) //gap为hk
{
for(int i=gap;i<inter.length;i++)
{
int j=i;
int temp=inter[i];
for(;j>=gap && temp<inter[j-gap];j-=gap)
inter[j]=inter[j-gap];
inter[j]=temp;
}
}
}
private static void outPut(int []inter)
{
for(int n:inter)
{
System.out.printf("%d ", n);
}
} }

实现希尔排序的方法是SellSort(int inter[]);

接下来好好分析一下该算法的每个步骤:

假如输入的是:12          6      24        7             4        16(此时gap=4,i=4,j=4,temp=inter[4]=7)

1、此时gap=4

那么第一次7与12比较,如果小于就互相交换。

i++,12与4比较,小于就互换,

i++, 4与6比较,小于就互换,

i++,16与24比较,小于就互换。

第一趟之后为: 7           4      16                   6

2、

4     4      16       12      12      6        24

此时gap=2

那么第一次4与7比较,如果小于就互相交换。

4 7 12  12 6 24

i++,16与4比较,小于就互换,这里16大于4,不变

4 16 12 6 24

i++, 12与7比较,不变,12与4比较,不变

4 7 12 6 24

i++,12与16比较,小于,于是变成 4 4 7  <>   12  16  6 24,12与4比较,大于4,因此12放进16原来在的位置

4 12 16 24

同样道理比较相同颜色的元素,进行排序。

.

.

.

第二趟之后为: 4       4       6        12        7        16      12       24

.

.

.

直到gap=1

每一趟的排序结果为(输入为:12      4       6        24      7        12         4       16)

7 4 4 16 12 12 6 24

4 4 6 12 7 16 12 24

4 4 6 7 12 12 16 24

4 4 6 7 12 12 16 24

总而言之:

gap的值就是hk,元素之间的间隔,这道题中gap=4,2,1。最外层的循环是给出gap的值.(每次都除以二),然后在循环里面开始对相隔为gap的元素进行插入排序,直到最后一趟比较相邻之间的元素。

希尔排序的最坏运行时间为O(N^2).由于Shell算法中增加了一个辅助空间temp,因此算法的辅助空间为S(n)=O(1).Shell排序是不稳定的。

java排序算法之希尔排序的更多相关文章

  1. 【DS】排序算法之希尔排序(Shell Sort)

    一.算法思想 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法.希尔排序是基于插入排序的以下两点性质而提出改进方法的:1)插入排序在对几乎已经排好序的数据操作 ...

  2. 数据结构与算法之PHP排序算法(希尔排序)

    一.基本思想 希尔排序算法是希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接 ...

  3. 算法相关——Java排序算法之希尔排序(五)

    个子块,即{3,5},{1,0},{5,2},{9,4},{6,12},将每个子块进行插入排序(即第i位与第i+5位进行比较交换),初步排序结果为{3,0,2,4,6,5,1,5,9,12}.希尔排序 ...

  4. 我的Java开发学习之旅------>Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

  5. 【排序算法】希尔排序算法 Java实现

    希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎 ...

  6. Java学习笔记——排序算法之希尔排序(Shell Sort)

    落日楼头,断鸿声里,江南游子.把吴钩看了,栏杆拍遍,无人会,登临意. --水龙吟·登建康赏心亭 希尔算法是希尔(D.L.Shell)于1959年提出的一种排序算法.是第一个时间复杂度突破O(n²)的算 ...

  7. 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)

    插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...

  8. 排序算法之希尔排序的python实现

    希尔排序(Shell’s Sort)是插入排序的一种,是直接插入排序算法的一种更高版本的改进版本. 希尔排序的工作原理 如下: (1)把记录按步长gap分组,对每组记录采用直接插入排序方法进行排序: ...

  9. js排序算法06——希尔排序

    希尔排序本质是一种插入排序,由一位叫希尔的大神提出得名,其基本思想是将数组分组进行插入排序,每次消除不止一个逆序对,这样就提高了插入排序的效率.最后一步进行一间隔的插入排序,此时数组已经基本有序.代码 ...

随机推荐

  1. mybatis foreach报错It was either not specified and/or could not be found for the javaType Type handler

    或许是惯性思维,在mybatis使用foreach循环调用的时候,很多时候都是传一个对象,传一个List的情况很少,所以写代码有时候会不注意就用惯性思维方法做了. 今天向sql传参,传了一个List作 ...

  2. DCT(离散余弦变换)算法原理和源码(python)

    原理: 离散余弦变换(DCT for Discrete Cosine Transform)是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Tra ...

  3. numpy创建矩阵常用方法

    numpy创建矩阵常用方法 arange+reshape in: n = np.arange(0, 30, 2)# start at 0 count up by 2, stop before 30 n ...

  4. GitLab CI .NET 部署中的几个坑

    信息乱码 Msbuild编译失败 VS却编译成功 设置环境变量本地有用,但是runner跑起来就失败 powershell公共变量为空 命令执行失败,却集成成功,pass了 1.信息乱码 信息乱码是真 ...

  5. Abp + MongoDb 改造默认的审计日志存储位置

    一.背景 在实际项目的开发当中,使用 Abp Zero 自带的审计日志功能写入效率比较低.其次审计日志数据量中后期十分庞大,不适合与业务数据存放在一起.所以我们可以重新实现 Abp 的 IAuditi ...

  6. 2012-2014 三年浙江 acm 省赛 题目 分类

    The 9th Zhejiang Provincial Collegiate Programming Contest A    Taxi Fare    25.57% (166/649)     (水 ...

  7. C#系列之聊聊.Net Core的InMemoryCache

    作者:暴王 个人博客:http://www.boydwang.com/2017/12/net-core-in-memory-cache/ 这两天在看.net core的in memory cache, ...

  8. Mysql数据库的二进制安装和基础入门操作

    前言:Mysql数据库,知识非常的多,要想学精学通这块知识,估计也要花费和学linux一样的精力和时间.小编也是只会些毛皮,给大家分享一下~ 一.MySQL安装 (1)安装方式: 1 .程序包yum安 ...

  9. FastDFS 分布式文件存储目录

    1.fastdfs安装和配置 https://blog.csdn.net/hy245120020/article/details/78658081 2.使用nginx代理fastdfs以及图片裁剪(f ...

  10. shiro源码篇 - shiro的filter,你值得拥有

    前言 开心一刻 已经报废了一年多的电脑,今天特么突然开机了,吓老子一跳,只见电脑管家缓缓地出来了,本次开机一共用时一年零六个月,打败了全国0%的电脑,电脑管家已经对您的电脑失去信心,然后它把自己卸载了 ...