希尔排序简述  

希尔排序是基于插入排序的以下两点性质而提出改进方法的:
  1. 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。(希尔排序先将部分数据进行排序,相当于已经部分排好序)
  2. 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。(希尔排序先将间隔大的数据进行大的移位,后期的移位距离相对要小很多)

分析:

  先去一个小于n的整数的H作为第一个增量,把文件的全部记录分组。即将所有距离为H的倍数的记录放在同一个族中,先在各组内进行直接插入排序;然后去第二个增量重复上述的分组和排序,直至所取的增量为1。

  例子:对7、10、1、9、2、5、8、6、4、3数组进行一增量为4的希尔排序过程,数组可以看成是由4个字数组组成(0、4、8)(1、5、9)(2、6)(3、7)。

后面如果取增量为1的话,就是对整个数组进行插入排序。

  希尔排序的优点就是减少了插入排序的数据的大量复制和移动,同时也是效率得到了很大的提高。

实现代码:

希尔排序类:

package com.dxx.order;

import java.util.ArrayList;

public class ShellSort {
private int arrs[];
//设置增量数组,公式为h=3*h+1,eg:1、4、13、40....找到接近数组长度但是小于它的增量为止
private ArrayList<Integer> rises = new ArrayList<Integer>(); public ShellSort(int[] arrs) {
super();
this.arrs = arrs;
} //定义增量数组
public void setRises(){
int len = arrs.length;
int h = 1;
int count=0;
while(true){
if(h>=len){
break;
}
rises.add(h);
h = 2*h + 1;
}
} public void sortArrs(){
int h,temp,len = rises.size();
//根据增量依次进行排序
for(int i=0; i<len;i++){
h = rises.get(len-1-i);
//对增量为h的数组进行排序arrs[h]
for(int k=h;k<arrs.length;k++){
//以冒泡排序的方式对一个增量为h的数组进行排序
if(arrs[k]<arrs[k-h]){
temp = arrs[k];
while(k>=h && temp<arrs[k-h]){
arrs[k] = arrs[k-h];
k-=h;
}
arrs[k] = temp;
k+=h;
}
} }
} public void sortArrs2(){
int group, i, j, temp;
int len = arrs.length;
for (group = len / 2; group > 0; group /= 2)
{
for (i = group; i < len; i++)
{
for (j = i - group; j >= 0; j -= group)
{
if (arrs[j] > arrs[j + group])
{
temp = arrs[j];
arrs[j] = arrs[j + group];
arrs[j + group] = temp;
}
}
}
}
} public void printArrs(){
for(int i :arrs){
System.out.print(i + " ");
}
System.out.println();
}
}

主程序类:

package com.dxx.order;

public class MainTest {

	public static void main(String[] args) {
int arrs[] = {14,3,2,5,12,8,6,7,10,11,1,9,13};
ShellSort shellSort = new ShellSort(arrs);
shellSort.printArrs();
shellSort.setRises();
shellSort.sortArrs();
shellSort.printArrs();
}
}

  

  

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

  1. 希尔排序及希尔排序java代码

    原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...

  2. 希尔排序(java)

    时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++ ...

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

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

  4. 排序---希尔排序Java

    希尔排序 插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减 ...

  5. 冒泡排序 选择排序 插入排序希尔排序 java

    双向冒泡 package com.huang; public class _014_bubb_sort { int[] b={1,2}; static int a[]={12,4,35,65,43,6 ...

  6. 插入排序与希尔排序Java实现

    public class TestMain { public static void main(String[] args) { Integer[] a = new Integer[5000]; fo ...

  7. 希尔排序——Java实现

    一.排序思想 希尔排序(Shell’s Sort)是插入排序的一种,是直接插入排序算法的一种更高版本的改进版本. 把记录按步长gap分组,对每组记录采用直接插入排序方法进行排序: 随着步长逐渐减小,所 ...

  8. 希尔排序java代码

    //希尔排序 通过测试 public class ShellSortTest{ public static void shellSort(int [] arrays){ for(int d=5;d&g ...

  9. C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)

    希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...

随机推荐

  1. CSS——inline-block属性

    Inline-block 是元素 display属性的一个值 .这个名字的由来是因为,可以简单的解释为inline+block :display设置这个值的元素,兼具行内元素( inline elem ...

  2. VMware中linux与window目录共享

    在虚拟机下来实如今windows下共享一个目录: (前提已安装完毕vmtools:http://blog.csdn.net/pipisorry/article/details/21318931) 打开 ...

  3. MyEclipse配置启动多个Tomcat

    在实际开发中常常会遇到多个项目同一时候进行,来回切换不太方便,这时可分别部署在多个tomcat下. 改动一些配置可同一时候启动多个tomcat 一開始查阅相关文档,看到一篇文章一个Myeclipse同 ...

  4. Dark Side of Cloud Storage —— 数据对像的分块消重

    数据对像(可以通俗地认为是文件)的分块存储具有久远的历史.长久以来,单机文件系统一直将文件切分为若干固定大小的小块.其主要目的是为了进行有效的空间管理.互联网时代,大规模数据存储逐步发展起来.出于降低 ...

  5. 基于Cocos2dx开发卡牌游戏Demo_放开那三国 2.0

    PS:下载地址在最以下 1.登录 2.副本选择 3.地图 4. 选择敌人 5. 战斗 6. 战斗结算 7. 地图拓展 8. 武将拓展 9. 下载地址: 点击打开链接

  6. Hdu 4738【求无向图的桥】.cpp

    题目: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸葛亮把所有炸弹都带走了,只留下 ...

  7. POJ 1088 滑雪 记忆化优化题解

    本题有人写是DP,只是和DP还是有点区别的,应该主要是记忆化 Momoization 算法. 思路就是递归,然后在递归的过程把计算的结果记录起来,以便后面使用. 非常经典的搜索题目,这样的方法非常多题 ...

  8. 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)

    原文: http://www.raywenderlich.com/64623/make-narrated-book-using-avspeechsynthesizer-ios-7 随着 PageVie ...

  9. Linux下SVN安装配置全程实录(转)

    一.安装SVN默认安装到/usr/local/bin下面 二.创建仓库 svnadmin create /home/svnrepo /root/svnrepo为所创建仓库的路径,理论上可以是任何目录 ...

  10. 成为JAVA软件开发工程师要学哪些东西

    2010-04-22 15:34 提问者采纳 Java EE(旧称j2ee)   第一阶段:Java基础,包括java语法,面向对象特征,常见API,集合框架: *第二阶段:java界面编程,包括AW ...