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. 透过表象看本质!?之三——Kalman滤波

    数据拟合能够估计出数据变化的趋势,另外一个同等重要的应用是如何利用这一趋势,预测下一时刻数据可能的值.通俗点儿说,你观察苍蝇(蚊子,蜜蜂)飞了几秒,你也许会想“它下一个时刻可能在哪儿”,“呈现出什么样 ...

  2. OnClientClick和OnClick

    OnClientClick是客户端事件处理方法,一般采用JavaScript来进行处理,也就是直接在IE端运行,一点击就运行 OnClick是服务器端事件处理函数,使用C#或者vb.net,在服务器端 ...

  3. 使用awk和grep做简单的统计

    grep 或 egrep 或awk 过滤两个或多个关键词: grep -E ‘123|abc’ filename // 找出文件(filename)中包含123或者包含abc的行 egrep ‘123 ...

  4. 一个很简单的php留言板。。。。搭建在sae上的。。。

    我在sae上搭建了一个个人简历的页面: 有兴趣的可以访问  http://671coder.sinaapp.com/ 在做下面一个简单的留言板的时候,卡了我很久,虽然完全没用过php..但是还是最后勉 ...

  5. VC++笔记七

    动态链接库修改文件名问题? eg:GetRadarFS.dll->RadarModel.dll; 注意修改:打开文件GetRadarFs.def 修改 LIBRARY  "GetRad ...

  6. Java批量生成Mac地址到文件

    public class Main { public static void main(String[] args) { // 生成文件名称 String filePath = "mac.t ...

  7. android花屏效果的实现(ViewPager的基本使用)

    1.程序运行效果图 二.代码实现 1.main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/re ...

  8. Python金融应用编程(数据分析、定价与量化投资)

    近年来,金融领域的量化分析越来越受到理论界与实务界的重视,量化分析的技术也取得了较大的进展,成为备受关注的一个热点领域.所谓金融量化,就是将金融分析理论与计算机编程技术相结合,更为有效的利用现代计算技 ...

  9. ALV双击单元格事件处理

    *激发双击事件 FORM f_alv_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. "先引 ...

  10. acFileStorage equivalent

    searching for a vcl that can enable embed any files within dfm similar to acfilestorage When there a ...