[算法] shell sort
public void sort(int[] list) { int gap = list.length / 2; while (1 <= gap) { for (int i = gap; i < list.length; i++) { int j = 0; int temp = list[i]; for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap) { list[j + gap] = list[j]; } list[j + gap] = temp; } gap = gap / 2; } }
shell sort,希尔排序,缩小增量排序是对插入排序的改进。
首先将待排序数据按照一定的步长gap分为多个组,针对每个组进行直接插入排序,然后缩小步长,进行上面同样的过程。
上面的程序在许多地方出现,我就原封不多呢拷过来了,包括下面的引用 [1] 当中。
为什么说是针对每个分组的插入排序?
外层 for针对每一个分组的终点,显然每一个终点只能属于一个分组。内层for当然就是对这个分组进行插入排序了
假设gap=3
下面的数字是数组当中的下标
0 1 2 3 4 5 6 7 8 9 10
这里 0 3 6 9是一个分组;2,4,7,10是一个分组;2,5,8是一个分组
首先从3开始 比较0,3
然后4,比较1,4
然后5,比较2,5
然后6,比较0,3,6 这里可以看到0,3在前面已经比较过了,所以这里只需要寻找6的插入位置即可。
然后7,比较1,4,7 这里的1,4已经比较过了,所以这里只需要寻找7的插入位置即可
然后8,比较2,5,8 这里的2,5已经比较过了,所以只需寻找8的插入位置即可
然后9,比较0,3,6,9这里0,3,6已经比较过了,所以只需寻找9的插入位置即可
然后10,比较1,4,7,10 这里1,4,7已经比较过了,所以只需寻找10的插入位置即可