思路
设置一个gap,每次取出下标为gap+k的元素进行排序【插排】(k=0,1,2…)
gap每次排完所有的元素后递减(一般gap = len/2;gap=gap/2)
为什么快
插排的速度和逆序的个数有关,而每一次希尔排序处理都会减少逆序个数,但排序中不是一个个排序而是对所选的元素排序
对于9,2,-1,0升序
在处理9,-1交换时,正常的插排要对9,2,-1进行排序,共3次
而希尔排序只需要对9,-1排序,共2次。
代码
insertPro 将原先的间隔为1变为gap,初始值i设置为start+gap(就是一个改进的插排)
shell 控制gap的递减
static int[] shell(int[] ar){
int len = ar.length;
int gap = len/2;
while(gap!=0){
for (int k = 0; k < gap; k++){
insertPro(ar,gap,k);
}
gap = gap/2;
}
return ar;
}
private static void insertPro(int[] ar,int gap,int start){
for (int i = start+gap; i < ar.length; i+=gap) {
int tmp = ar[i];
for (int j = i-gap; j >=0; j-=gap) {
if(ar[j]>tmp){
ar[j+gap] = ar[j];
}else{
break;
}
ar[j] = tmp;
}
}
}