希尔排序是直接插入排序算法的一种更高效的改进版本。
希尔排序思想:
按照增量d对其进行分组,每组内部分别进行直接插入排序;
(如果不太懂直接插入排序的java具体实现方法,可参考本人所写另一篇博文:直接插入排序)
一般首先取d等于序列长度的一半,然后以后每次减半,直到增量等于1.
下面是本人用ProcessOn所绘制的排序过程图:
(以11个数为例进行说明,请大家认真分析此图,耐心一点,写得很详细,看完此图应该会有所收获)
说明:
下图中不同颜色的线代表不同的分组,例如下图中第一行黑色线相连的有426,-2,23,说明426,-2,23被分为一组,并对426,-2,23进行直接插入排序;
第一行蓝色线相连的有62 ,0说明62,0被分为一组;
同理下面的连线分组都是这样的。
java实现代码(有注释):
public void toShellSort(int []arr) {
//增量在刚开始的时候为数组长度的一半,以后每次减半,直到增量大于0不成立
for(int d = (int)(arr.length/2); d > 0; d = (int)(d/2)) {
//首先从每组的第二个数开始,第一次循环是第一组第二个数与第一个数比较,第二次循环是第二组第二个数与第二组第一个数比较
//进行d次循环后,如果后面还有数
//第d次循环是第一组第3个数与前面已从小到大排好序的序列比较,第d+1次循环是第二组与第3个数与前面已排好序的序列比较,
//差不多就是对每组分别进行插入排序
for(int i = d;i<arr.length;i++) {
int tempIndex = i;
while(tempIndex - d >=0 && arr[tempIndex] < arr[tempIndex-d]) {
int temp = arr[tempIndex];
arr[tempIndex] = arr[tempIndex-d];
arr[tempIndex-d] = temp;
tempIndex = tempIndex-d;
}
}
}
}
运行效果截图:
种一棵树最好的时间是10年前,其次是现在,身为后浪,加油!