Shell Sort based on insert sort

Reason:when it comes to insert sort,the snail appears,as it just moves forward step by step or even worse.So we need some improvement.the first idea may be that we can walk forward in big strides.Shell sort do the same thing.

the basic realization(forward):

public static void shellSort(Comparable[] a){
int len=a.length;
int stepLen=len/3;
boolean flag=true;
int index=0;
while(flag){
for(int i=0;i<stepLen;++i){
for(int j=i+stepLen;j<len;j+=stepLen){
//insert sort
for(int k=j;k>0;k-=stepLen){
if(less(a[k],a[k-stepLen])){
swap(a,k,k-stepLen);
}else{
break;
}
}
}
}
stepLen/=3;
//make sure the last step length is 1
if(stepLen==0){
if(index>0){
flag=false;
}
stepLen=1;
++index;
}
}
}

the update realization(reverse):

public static void updateShellSort(Comparable[] a){
int N=a.length;
int h=1;
while(h<N/3) h=3*h+1;
while( h >= 1){
for(int i=h;i<N;++i){
for(int j=i;j>=h && less(a[j],a[j-h]);j-=h){
swap(a,j,j-h);
}
}
h=h/3;
}
}
posted @ 2017-03-11 12:28  空山皓月  阅读(192)  评论(0编辑  收藏  举报