希尔排序本质上是一种插入排序,然则对数列举行了等距离分组处置惩罚,在每一组中做插入排序,这一优化使得时候复杂度降到了O(n^2)以下。
基础思想
希尔排序是按肯定的距离对数列举行分组,然后在每个分组中做插入排序;随后逐次减少距离,在每个分组中做插入排序…直到距离即是1,做一次插入排序后完毕。
那末题目来了,距离应当取多大,怎样减少?一般我们去取初始距离为数列长度的一半:gap = length/2,以 gap = gap/2 的体式格局减少,下面细致图解全部历程。
原始数组数组以下:
首先取距离为 gap = length/2 = 4,将数组分为以下的4组,对每一组实行插入排序:
第一次排序,每一组较小的元素都移到了相对靠前的位置(这个状况能够叫 n-sorted,即以n为gap分组有序),能够设想相对有序的数组能够更有利于背面的排序。接着继承分组,gap = gap/2 = 2,对每一组实行插入排序:
继承对数组分组,gap = gap/2 = 1,即一切元素构成一组,做插入排序完成算法:
代码完成
内层轮回运用的插入排序与一般的插入排序基础一致,只是每次挪动的步长变成 gap 而不是 1:
// 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));