【JavaScript算法】---希尔排序(转载自个人老师 Alley-巷子)

1、什么是希尔排序算法

希尔排序(Shell's Sort)是 插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。
 
思路:
     希尔排序是把记录按下标的必定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减小,每组包含的关键词愈来愈多,当增量减至1时,整个文件恰被分红一组,算法便终止
 
逻辑:
    在希尔排序中最重要的是分组,咱们先找到一个间隔,每隔必定的间隔将这些数字排位一组,
    假设有这样一个数组 [9,1,2,5,7,4,8,6,3,5] ;咱们每隔5个为一组。那么这个数组被咱们分红了如下几组
    第一组:9    4
    第二组:1   8
    第三组:2   6
    第四组:5   3
    第五组:7   5
    
    分组完毕后咱们在每隔组的组内进行排序  
 
    第一组: 4   9
    第二组:1    8
    第三组    2    6
    第四组    3    5
    第五组    5    7
 
    排序后咱们在将这个数组从新设间隔从新进行排序(下一次的间隔减半)  2个为一组
    [4,1,2,3,5,9,8,6,5,7]
    
     第一组:4  2  5  8   5   ==》组内排序   2 4 5 5 8
     第二组:1  3  9  6   7   ==》组内排序   1 3 6 7 9
     
    2  1  4  3  5  6  5  7  8  9
    
 
    排序后咱们在将这个数组从新设间隔从新进行排序(下一次的间隔减半)  1个为一组最后一次也就是两两比较
    
    1  2  3  4  5   5  6  7  8  9
    
 
注意:间隔在希尔排序中通常是没有特别的规定,一般状况下是数组长度的一半
 
 
2、代码
复制代码
var arr = [2,5,1,9,0]
//算间隔
var len = Math.floor(arr.length/2)
while(len>0){
    for(var i=len;i<arr.length;i++){
        var temp = arr[i];
        for(var j=i-len;j>=0&&temp<arr[j];j=j-len){
            arr[j+len] = arr[j]
        }
        arr[j+len] = temp;
    }
    len = Math.floor(len/2)
}
复制代码
相关文章
相关标签/搜索