希尔排序是希尔(Donald Shell) 于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序
增量开始为gap=length/2,缩小增量继续以gap = gap/2的方式,直到gap=1后,当gap为1时这时候也就相当于对整个数组进行插入排序
Array.prototype.shellSort = function() { let len = this.length let gap = parseInt(len/2) while(gap > 0){ // console.log(1) for (let i = 0; i < gap; i++) { for (let j=i; (j+gap)<len; j+=gap) { for (let k = j+gap; k > 0; k-=gap) { // 这里其实就是插入排序 if (this[k] < this[k-gap]) { // 这里开始和左边已排好序的进行比较,如果小于前面的就换位 let tempnum = this[k] this[k] = this[k-gap] this[k-gap] = tempnum } else { // 这时候最大的已经在最右边了,没必要再和前面比了 break } } } } gap = parseInt(gap/2); } } let arr = [2,9,5,7,1,1,6,3,3,4] arr.shellSort() console.log("排序后:", arr5.toString()) // 1,1,2,3,3,4,5,6,7,9