希尔排序算法
前言 当待插入元素是一个很小(当需求是从小到大排序时,从大到小排序时此处为很大)直接插入排序需要移动较多次数,性能会很差。希尔排序解决了这一问题。 基本思想 希尔排序的基本思想: 把序列按下标的一定增量分组,对每组使用直接插入排序算法排序; 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 如果对直接插入排序不了解的朋友,可以看我的这篇文章: 详解直接插入排序算法 例子 给定数组arr为 [ 3 , 6 , 5 , 12 , 1 , 75 , 10 , -3, 0 ] 初始状态见下图: 定义变量 h 为增量,初始值为5 。 第一轮 根据增量设置成5组,颜色相同的为一组。 对每一组进行直接插入排序得到: 然后 h减半向下取整; 则 h = 3; 第二轮 根据增量设置成5组,颜色相同的为一组。 对每一组进行直接插入排序得到: 然后 h减半向下取整; 则 h = 1; 第三轮 增量为1,所有序列为一组。 插入排序后得到: h此时为1,全部有序,完毕。 由例子可知,每次都可以达到组内部分有序,大大减少了插入排序的移动开销。 代码 首先说下步长的选择: 步长的选择一般时这样的: int h = 1; while(h < arr.length / 2){ h = 2 * h + 1; } 即先把步长设置为1,只要 h 小于数组长度一半(向下取整