java排序算法之希尔排序
希尔排序是冲破二次时间屏障的第一批算法之一。
它是通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到最后一趟(比较相邻元素)为止。因此希尔排序也叫缩减增量排序。
希尔排序使用一个序列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排序算法之希尔排序的更多相关文章
- 【DS】排序算法之希尔排序(Shell Sort)
一.算法思想 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法.希尔排序是基于插入排序的以下两点性质而提出改进方法的:1)插入排序在对几乎已经排好序的数据操作 ...
- 数据结构与算法之PHP排序算法(希尔排序)
一.基本思想 希尔排序算法是希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接 ...
- 算法相关——Java排序算法之希尔排序(五)
个子块,即{3,5},{1,0},{5,2},{9,4},{6,12},将每个子块进行插入排序(即第i位与第i+5位进行比较交换),初步排序结果为{3,0,2,4,6,5,1,5,9,12}.希尔排序 ...
- 我的Java开发学习之旅------>Java经典排序算法之希尔排序
一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...
- 【排序算法】希尔排序算法 Java实现
希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎 ...
- Java学习笔记——排序算法之希尔排序(Shell Sort)
落日楼头,断鸿声里,江南游子.把吴钩看了,栏杆拍遍,无人会,登临意. --水龙吟·登建康赏心亭 希尔算法是希尔(D.L.Shell)于1959年提出的一种排序算法.是第一个时间复杂度突破O(n²)的算 ...
- 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...
- 排序算法之希尔排序的python实现
希尔排序(Shell’s Sort)是插入排序的一种,是直接插入排序算法的一种更高版本的改进版本. 希尔排序的工作原理 如下: (1)把记录按步长gap分组,对每组记录采用直接插入排序方法进行排序: ...
- js排序算法06——希尔排序
希尔排序本质是一种插入排序,由一位叫希尔的大神提出得名,其基本思想是将数组分组进行插入排序,每次消除不止一个逆序对,这样就提高了插入排序的效率.最后一步进行一间隔的插入排序,此时数组已经基本有序.代码 ...
随机推荐
- vue属性监听
1.watch:用来监听每一个属性的变化 2.watch这个对象里面都是函数,函数的名称是data中的属性名称,watch中的函数不需要调用 3.当属性发生改变那么就会触发watch函数,每个函数都会 ...
- 关于 Spring Security OAuth2 中 CORS 跨域问题
CORS 是一个 W3C 标准,全称是”跨域资源共享”(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了 AJA ...
- [Be a Coding Plasterer] Components 1:get Basic Things
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. Written In The Font I a ...
- python练习五—简单web应用
配置apache 我以前web开发基本都是基于java平台的,比如tomcat,servlet等等,由tomcat接收http请求,然后交给servlet处理,servlet处理完成以后把返回结果交给 ...
- DateTimeHelper
本文参考文章: http://geekswithblogs.net/mnf/articles/my-datetimehelper-class.aspx https://referencesource. ...
- 【转载】wifi的两种工作模式
AP:即无线接入点,是一个无线网络的中心节点.通常使用的无线路由器就是一个AP,其它无线终端 可以通过AP相互连接. STA:即无线站点,是一个无线网络的终端.如笔记本电脑.PDA等. 1>工作 ...
- Dubbo 源码解析四 —— 负载均衡LoadBalance
欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 Dubbo 入门之二 --- 项目结构解析 Dubbo 源码分析系列之三 -- 架构原 ...
- tiny210 tslib 测试(基于 ft5x06 触摸屏),解决触摸无效问题
1. 拷贝至开发板 将上次实验中的 tmp 文件夹拷贝到开发板,可以通过 nfs 来传输,并将 tmp/lib 下的所有 .so 文件拷贝至 开发板的 /usr/lib 中,并且确保库的映射关系正确. ...
- 怎么将XML字符串转换为XmlDocument,并获取部分节点值
我们的目标:解析XML字符串,并获取节点:z:row下的属性:ows_LinkFilename的值集合??? XML字符串数据结构如下: <listitems xmlns:s='uuid:BDC ...
- 第一册:lesson thirty five。
原文: Our village . This is a photograph of our village. Our village is in a valley. It is between to ...