Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:

(1). 当数据规模小的时候非常高效。

(2). 当给定数据已经有序时的时间代价为O(N)

所以,Shell排序每次把数据分成若干块,来使用插入排序,而且之后在这若干个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后一个块,并使用插入排序。

这里每次分成若干小块是通过“增量”来控制的,开始时增量较大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小“增量”最终到减小到1.

一直较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5),所以在实现Shell排序的时候采用该增量序列

publicabstractclass Sorter<E extends Comparable<E>>  {

publicabstractvoid sort(E[] array,int from ,int len);

publicfinalvoid sort(E[] array)

{

sort(array,0,array.length);

}

protectedfinalvoid swap(E[] array,int from ,int to)

{

E tmp=array[from];

array[from]=array[to];

array[to]=tmp;

}

publicvoid sort(String helloString, int from, int len) {

// TODO Auto-generated method stub

}

}

publicclass ShellSorter <E extends Comparable<E>>extends Sorter<E>{

publicstaticvoid main(String[] args){

String[] myStringArray1 = {"1","3","2","4","6","5"};

ShellSorter<String> s1 = new ShellSorter<String>();

for(int i=0;i<6;i++){

System.out.println(myStringArray1[i]);

}

s1.sort(myStringArray1, 0, 6);

}

@Override

publicvoid sort(E[] array, int from, int len) {

// TODO Auto-generated method stub

int value=1;

while((value+1)*2<len){

value=(value+1)*2-1;

}

for(int delta=value;delta>=1;delta=(delta+1)/2-1){

for(int i=0;i<delta;i++){

modify_insert_sort(array,from+i,len-i,delta);

}

}

}

privatefinalvoid modify_insert_sort(E[] array, int from, int len,int delta){

if(len<=1)return;

E tmp=null;

for(int i=from+delta;i<from+len;i+=delta){

tmp=array[i];

int j=i;

for(;j>from;j-=delta){

if(tmp.compareTo(array[j-delta])<0){

array[j]=array[j-delta];

}else{

break;

}

array[j]=tmp;

}

}

}

}

JAVA实现Shell排序的更多相关文章

  1. 基本排序算法——shell排序java实现

    shell排序是对插入排序的一种改进. package basic.sort; import java.util.Arrays; import java.util.Random; public cla ...

  2. Java常见排序算法之Shell排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  3. Java排序算法(四):Shell排序

    [基本的想法] 将原本有大量记录数的记录进行分组.切割成若干个子序列,此时每一个子序列待排序的记录个数就比較少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时.再对全体记录进行一次直 ...

  4. java排序算法(八):希尔排序(shell排序)

    java排序算法(八):希尔排序(shell排序) 希尔排序(缩小增量法)属于插入类排序,由shell提出,希尔排序对直接插入排序进行了简单的改进,它通过加大插入排序中元素之间的间隔,并在这些有间隔的 ...

  5. 希尔shell排序——java实现

    希尔排序是对插入排序的优化,将插入排序的交换步长由1增加到h. 希尔排序的思想是使数组中任意间隔为h的元素有序.步长调幅为h = 3*h + 1, 也就是1,4,13,40,121,364, 1003 ...

  6. 【排序算法】——冒泡排序、选择排序、插入排序、Shell排序等排序原理及Java实现

    排序 1.定义: 所谓排序,即是整理文件中的内容,使其按照关键字递增或递减的顺序进行排列. 输入:n个记录,n1,n2--,其对应1的关键字为k1,k2-- 输出:n(i1),n(i2)--,使得k( ...

  7. Java实现希尔排序

            华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序.如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作).         看到了这 ...

  8. 数据结构与算法之--高级排序:shell排序和快速排序

    高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...

  9. Java基础学习总结(28)——Java对各种排序算法的实现

    这里总结下各种排序算法的java实现 冒泡排序 public class BubbleSort { publicstaticint[] bubbleSort(int[] array) { if(arr ...

随机推荐

  1. [放松一下] 经典高清电影合集 170G BT种子下载

    经典高清电影合集 170G BT种子下载 点击文件名下载 经典高清电影合集170G BT种子.torrent 下载方法 经典高清电影合集详情见目录: 1. 杀手47 2. 这个杀手不太冷 3. 放牛班 ...

  2. 【Android】属性动画

    转载请注明出处:http://blog.csdn.net/h28496/44338669 属性动画的原理 通过不断的设置一个View的属性让其出现动画效果.比如,不断地设置一个Button的x值.这个 ...

  3. windows 2003 域控制器(AD)的常规命令行操作以及修复

    查询服务器的角色 Netdom query fsmo 强制升级操作主机角色(如果两台DC都无损,可以直接用图形模式传送,这里指的是一台DC出问题,另一台强制升级占用角色的情况) Ntdsutil Ro ...

  4. mysql 密码过期问题 password_expired

    mysql> select user,host,password_expired from mysql.user; +-----------------+----------------+--- ...

  5. Re-installation failed due to different application signatures.

    出现此问题是由于apk的签名不同所致(假设不知道签名是什么  请看上一篇Android应用程序签名 debug签名).假设你是使用的自己的签名,那就是你新版本号的apk使用的签名文件与上一版本号(也就 ...

  6. K. Perpetuum Mobile

    The world famous scientist Innokentiy almost finished the creation of perpetuum mobile. Its main par ...

  7. nodejs、gulp调试工具node-inspector使用

    俗话说欲善其功,必先利其器. 作为目前新型的Web Server开发栈倍受开发者关注的Nodejs来说,调试技术是学习开发的基石,所以对于开始学习Nodejs童鞋来说,Nodejs的调试工具使用是必不 ...

  8. MFC如何生成一个可串行化的类

    一.MFC允许对象在程序运行的整个过程中持久化的串行化机制 (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程. (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构 ...

  9. javascript 自己主动绑定JS callback 的方法函数

    自己写的一个javascript 智能绑定callback 而且调用运行的函数.主要用于异步请求的 ajax中: <!DOCTYPE html> <html> <head ...

  10. Xamarin.forms 自定义dropdownview控件

    一 基本说明 想用xamarin做个像美团这样的下拉列表进行条件选择的功能,但是但是找了半天好像没有现成的,也没有其他类似的控件可以走走捷径,再则也没有找到popwindow之类的东东,这里只好使用s ...