希尔排序本质上是一种插入排序,可是对数列进行了等间隔分组处理,在每一组中作插入排序,这一优化使得时间复杂度降到了O(n^2)如下。算法
希尔排序是按必定的间隔对数列进行分组,而后在每个分组中作插入排序;随后逐次缩小间隔,在每个分组中作插入排序...直到间隔等于1,作一次插入排序后结束。shell
那么问题来了,间隔应该取多大,怎么缩小?一般咱们去取初始间隔为数列长度的一半:gap = length/2,以 gap = gap/2 的方式缩小,下面详细图解整个过程。数组
原始数组数组以下:优化
首先取间隔为 gap = length/2 = 4,将数组分为以下的4组,对每一组实施插入排序:spa
第一次排序,每一组较小的元素都移到了相对靠前的位置(这个状态能够叫 n-sorted,即以n为gap分组有序),能够想象相对有序的数组可能更有利于后面的排序。接着继续分组,gap = gap/2 = 2,对每一组实施插入排序:3d
继续对数组分组,gap = gap/2 = 1,即全部元素组成一组,作插入排序完成算法:code
内层循环使用的插入排序与普通的插入排序基本一致,只是每次移动的步长变为 gap 而不是 1:blog
// shellSort function shellSort(arr) { for(let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)) { // 内层循环与插入排序的写法基本一致,只是每次移动的步长变为 gap for(let i = gap; i < arr.length; i++) { let j = i; let temp = arr[j]; for(; j> 0; j -= gap) { if(temp >= arr[j-gap]) { break; } arr[j] = arr[j-gap]; } arr[j] = temp; } } return arr; } // example let arr = [2,5,10,7,10,32,90,9,11,1,0,10]; alert(shellSort(arr));