希尔排序
希尔排序的最大间隔是利用公式 h = h * 3 + 1
当前h设置为1 ,减小间隔公式 h = (h - 1) / 3
/*
h = 4;
while(h > 0){
long temp = 0;
for(i = 4; i < 9; i++){
第一次
temp = array[4];
j = 4;
while(j > 3 && array[0] > 2){
array[4] = array[0];
j = 0;
}
array[0] = 2;
array = [2,23,34,1,12,4,15,67,23];
第二次 i = 5
temp = array[5] = 4;
j = 5;
while(j > 3 && array[1] > 4){
array[5] = array[1] = 23;
j = 1;
}
array[1] = 4;
array = [2,4,34,1,12,23,15,67,23];
第三次 i = 6;
temp = array[6] = 15;
int j = i = 6;
while(j > 3 && array[2] > 15){
array[6] = array[2] = 34;
j = 2
}
array[2] = 15;
array = [2,4,15,1,12,23,34,67,23];
第四次
temp = array[7] = 67
i = 7;
while(j > 3; array[3] > 67 (不符合条件不进行循环操作){
}
array[7] = 67
}
}
后面的就是一个这样排序过程,通过减小间隔再次重新排序,当排到间隔为0时推出循环
*/
long[] array = {12,23,34,1,2,4,15,67,23};
public long[] shellSort(long[] array){
int h = 1;
// 计算最大间隔
while(h < array.length / 3){
h = h * 3 + 1;
}
while(h > 0){
//进行排序
long temp = 0;
for(int i = h; i < array.length; i++){
temp = array[i];
int j = i;
while(j > h - 1 && array[j - h] > temp){
array[j] = array[j - h];
j -= h;
}
array[j] = temp;
}
// 减小间隔
h = (h - 1) / 3;
}
return array;
}