原理:不停拆分,对各个小子序列进行直接插入排序再更换步长继续排序,等基本有序后再进行一次直接插入排序。
public static int[] ShellSort(int[]a){
int k;
for(int i=a.length/2;i>0;i/=2){
//i为步长
for(int j=i;j<a.length;j++){
//j为后半段
int tmp = a[j];
for( k=j-i;k>=0;k-=i){
//k为前半段
if(tmp<a[k]){
a[k+i] = a[k];
}
else{
break;
}
}
a[k+i] = tmp;
}
}
return a;
}
看着是三重循环,第一重用来设置步长进行每次排序,j为后半段每次进1与前面的每段进行比较,也就是一个跨度为i的直接插入排序
不稳定,最好、平均时间复杂度为,最坏为