希尔排序
希尔排序的逆序对的数量逐渐在减少,而插入排序的复杂度与逆序对的数量有关( 逆序对越少,复杂度越小),所以希尔排序底层一般使用插入排序对每一列进行排序。
- 把序列看作是一个矩阵,分为m列,逐略进行排序
- m = n / (2k k=1,2,…; n为序列长度),直到m逐渐减为1
- 当m=1时,整个序列将完全有序。
public class ShellSort {
protected void sort(int[] array) {
int size=array.length;
int jmp = size/2; //步长
while(jmp!=0) {
for(int i=jmp;i<size;i++) {
int tmp=array[i];
int j=i-jmp;
while(j>=0&&tmp<array[j]) {//插入排序
array[j+jmp]=array[j];
j=j-jmp;
}
array[j+jmp]=tmp;
}
jmp=jmp/2;
}
}
}