上篇blog中介绍的直接插入排序,希尔排序就是对直接插入排序的一个优化。好比有这么一种状况:对一个无序数组进行从小到大的排序,可是数组的最后一个位置的数是最小的,咱们要把它挪到第一个位置,其余位置的都要日后移动,要是这个数组很是大,那么直接插入排序的开销就很是大。java
如今有一个array,希尔排序就是设定一个增量incrementNum(0<incrementNum<array.length)。数组
先从array[0]开始,以incrementNum为增量的进行直接插入排序,直到数组末尾,而后从array[1]开始重复:以incrementNum为增量的进行直接插入排序; 而后从array[1]开始重复......一直到array[n]。优化
而后取一个小于上一步增量的新的增量(好比设置为incrementNum/2),对前一个步骤的结果array进行遍历,直接插入排序....spa
再取小于上一步增量的新的增量,重复进行:遍历,直接插入排序code
直到新的增量小于1以后再退出循环blog
步骤1:好比如今有数组{82 ,31 ,29 ,71, 72, 42, 64, 5,110} 第一次取增量设置为array.length/2 = 4 先从82开始以4为增量遍历直到末尾,获得(82,42) 排序获得{42 ,31 ,29 ,71, 72, 82, 64, 5,110}。 而后从第二个数31开始重复上一个步骤,获得(31,64) 排序获得{42 ,31 ,29 ,71, 72, 82, 64, 5,110}....... 以4为增量的遍历完数组以后,获得的结果是{42 ,31,5,71,72,82,64,29,110}排序
而后从新区增量,这儿设定为incrementNum/2 = 2,对{42 ,31,5,71,72,82,64,29,110}重复步骤1。 完事以后,在取新的增量,重复步骤1。 直到取到的增量小于1,退出循环。rem
java实现代码以下:class
/** * 希尔排序 * @param arrays 须要排序的序列 */ public static void sort(int[] arrays){ if(arrays == null || arrays.length <= 1){ return; } //增量 int incrementNum = arrays.length/2; while(incrementNum >=1){ for(int i=0;i<arrays.length;i++){ //进行插入排序 for(int j=i;j<arrays.length-incrementNum;j=j+incrementNum){ if(arrays[j]>arrays[j+incrementNum]){ int temple = arrays[j]; arrays[j] = arrays[j+incrementNum]; arrays[j+incrementNum] = temple; } } } //设置新的增量 incrementNum = incrementNum/2; } }