希尔排序简述  

希尔排序是基于插入排序的以下两点性质而提出改进方法的:
  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. 你真的了解JAVA中与Webservice相关的规范和实现吗?

    非常多人在项目中使用Webservice,仅仅是知道怎样公布Webservice,怎样调用Webservice,但真要论其来龙去脉,还真不一定清楚. 一切一切还要从我们伟大的sun公司规范说起. JA ...

  2. Loser tree in Python | Christan Christens

    Loser tree in Python | Christan Christens Loser tree in Python I am taking an Advanced Data Structur ...

  3. Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库

    一.依赖注入DI 通过依赖注入降低View.服务.资源简化初始化.事件绑定等反复繁琐工作 AndroidAnnotations(Code Diet) android高速开发框架 项目地址:https: ...

  4. 谈论高并发(三十)解析java.util.concurrent各种组件(十二) 认识CyclicBarrier栅栏

    这次谈话CyclicBarrier栅栏,如可以从它的名字可以看出,它是可重复使用. 它的功能和CountDownLatch类别似,也让一组线程等待,然后开始往下跑起来.但也有在两者之间有一些差别 1. ...

  5. 《算法导论》 — Chapter 7 高速排序

    序 高速排序(QuickSort)也是一种排序算法,对包括n个数组的输入数组.最坏情况执行时间为O(n^2). 尽管这个最坏情况执行时间比較差.可是高速排序一般是用于排序的最佳有用选择.这是由于其平均 ...

  6. 【CSS3】transform-origin原点旋转

    忙乱, 点 -moz-transform-origin: 0 0; -webkit-transform-origin:0 0; -o-transform-origin:0 0; 以右上角给原点 -mo ...

  7. debian下使用siege进行压力测试

    一:siege siege是开源的一个测试工具,可以对指定文本的URL列表进行负载测试,也可以在执行其他请求前让某个请求休眠,从而让你感觉某个用户在转移到web应用的下一个文档前正在读取该文档. ht ...

  8. linux的tr命令

    tr(translate缩写)主要用于删除文件中的控制字符,或进行字符转换. 语法 tr [ -c | -cds | -cs | -C | -Cds | -Cs | -ds | -s] [ -A] S ...

  9. BGP的状态机制

    Idle 状态:即空闲状态,不接受任何BGP的连接,等待Start事件的产生,如果有start事件产生,若有start事件产生,系统开启ConnectRetry定时器,向邻居发起TCP连接,并将状态变 ...

  10. ZTESoft 持续集成 编年史 之 持续集成探索---平台选择

    2012 年 7.8 月份,我们逐渐了解了持续集成的概念,同时我们家庭作坊的dailybuild方式不断爆出各种问题,并且已经无法满足日益增长的各种需求. 我们开始探索持续集成的不同实现方式,首先我们 ...