原理:不停拆分,對各個小子序列進行直接插入排序再更換步長繼續排序,等基本有序後再進行一次直接插入排序。
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的直接插入排序
不穩定,最好、平均時間複雜度爲,最壞爲