static void shellSort(int[] data){
int sizeOfSeq=0; //分割的次数,即由步长所构成序列的长度,由以下动态求出
for(int h=1;h<data.length;h=3*h+1)
sizeOfSeq++;
int[] seq=new int[sizeOfSeq]; //步长数组,遵循seq[i+1]=3*seq[i]+1,经验最优序列
for(int i=0,h=1;i<seq.length;i++){
seq[i]=h;
h=3*h+1;
}
for(int i=seq.length-1;i>=0;i--){ //针对不同的步长
int step=seq[i];
for(int hCnt=0;hCnt<step;hCnt++){ //每个步长共需<步长>次
for(int j=hCnt+step,k;j<data.length;){ //针对每个步长的每一项,采用插入排序
int tmp=data[j];
k=j;
while(k-step>=0&&tmp<data[k-step]){
data[k]=data[k-step];
k-=step;
}
data[k]=tmp;
j+=step;
}
}
}
}