排序之希尔排序
希尔排序
我们先在方法中找出它最大的间隔h,
第一趟,将要排序的一组数按增量h分成若干组,每组中记录的下标相差h,
对每组中全部元素进行排序。
第二趟,间隔为h = (h-1)/3,以后的每趟间隔都是h = (h-1)/3,
直到间隔变为1,整个要排序的数被分成一组,排序完成。
一般的初次取序列的一半为增量,以后每次减半,直到增量为1。
public class ShellSort { public static void shellSort(int[] arr) { //临时变量,储存当前元素 int h = 1; //计算最大间隔 while(h<arr.length/3) { h = h*3 + 1; } while(h>0) { int tmp = 0; for(int i = h;i<arr.length;i++) { tmp = arr[i]; int j = i; while(j>h - 1&&arr[j-h]>=tmp) { arr[j] = arr[j-h]; j -= h; } arr[j] = tmp; } //减少间隔 h = ( h - 1) / 3; } } }