public class ShellSort {
public static void main(String[] args) {
int array[]={5,2,9,4,6,1};
shellSort(array);
out(array);
}
private static void shellSort(int[] array) {
int gap;
gap = array.length / 2;
while (gap >= 1) {
insertSort(array, gap);
gap /= 2;
}
}
// 增量插入
private static void insertSort(int[] array, int gap) {
int i, j;
int label;
for (j = gap; j < array.length; j += 1) {
label = array[j];
for (i = j - gap; i >= 0 && label < array[i]; i -= gap) {
array[i + gap] = array[i];
}
array[i + gap] = label;
}
}
private static void out(int[] array) {
// TODO Auto-generated method stub
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
System.out.println();
}
}
希尔排序是对直接插入排序的改进,第一个循环是对步长的设置,一次次减半变小,直至步长变为1,第二循环是将固定的步长将一个队列分成n各组,每一组进行一次直接插入排序。上边的代码用了两个方法,一个直接写的完整的希尔排序——shellSort1(),一个调用了封装好的可以设置步长的直接插入排序。上边有注释,理解起来应该不难。直接插入排序是基础,如果不懂可以先看看直插。