1. 基本概念
基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d,
对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序,
当增量减到1时,进行直接插入排序后,排序完成。
2. 算法分析
1、将包含n个元素的数组,分成n/2个数组序列,第一个数据和第n/2+1个数据为一对...
2、对每对数据进行比较和交换,排好顺序;
3、然后分成n/4个数组序列,再次排序;
4、不断重复以上过程,随着序列减少并直至为1,排序完成。
3. 代码实现
public void shellSort(int[] arr) {
int h = arr.length / 2;
while (h > 0){
System.out.println("插入间隔h=="+h);
for (int i = h; i < arr.length; i++){
int insertData = arr[i];
int j = i;
System.out.println("待插入数据 " + insertData);
for ( ; j > h - 1 && insertData < arr[j-h]; j-=h) {
System.out.print(insertData +"和" + arr[j-h]+"比较 ");
arr[j] = arr[j - h];
}
System.out.println();
arr[j] = insertData;
SortUtil.printArr(arr);
}
System.out.println();
h = h / 2;
}
}
4. 测试
@Test
public void test(){
int arr[] = {6,3,8,2,9,1};
System.out.println("排序前");
printArr(arr);
int[] data = sellSort(arr);
System.out.println("排序后");
printArr(data);
}
public void printArr(int[] arr){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
5. 总结
希尔排序的关键并不是随便分组后各自排序,而是将相隔某个“增量”的记录组成一个子序列,实现跳跃式移动,
使得排序的效率提高。需要注意的是,增量序列的最后一个增量值必须等于1才行。另外,由于记录是跳跃式的移动,
希尔排序并不是一种稳定的排序算法。