常见的排序算法----希尔排序(插入排序类,JavaScript实现)

思想
直接插入排序在某些时候效率是很高的,比如在
(1)数组本来就有序的时候,或者基本有序的时候,或者
(2)本来的元素很少
这样只需要进行很少的插入操作,效率就会变高了
但是这两个条件非常苛刻,那虽然条件可能本身不存在,但是可以人为创造条件
让元素变得基本有序,最后再执行直接插入排序是希尔排序的根本思想

做法是:
将原数组按照一定距离进行分组,并将各个分组进行插入排序,最后就可以变得基本有序,如有数组:[9,1,5,8,3,7,4,6,2],现在按照增量为4进行分组,则可分成:[9,3,2],[1,7],[5,4],[8,6],分别对这些组进行排序,有[2,3,9],[1,7],[4,5],[6,8],
最后回到原本的位置:[2,1,4,6,3,7,5,8,9],这样就会发现大的在后面,小的在前面,基本有序,这个时候只需要进行直接插入排序即可。

理解思路的视频
https://www.bilibili.com/video/av38482441


// 其实在进行分组排序时,只需要把他们看成是直接插入排序的增大版即可,即位置跨度较大
// 利用increment增量来进行跨度是多少,最后为1时就是普通的插入排序
// 增量序列的选择目前还是个数学难题,可根据适合的数进行选择
function shellSort(arr) { 
    var temp;
    var increment;
    var sortList = [3, 1];  //开始的时候进行跨度为3的分组,最后1表示直接插入排序
    for(var k = 0; k <sortList.length; k++) {
        increment = sortList[k];
        for(var i = increment; i < arr.length; i++) {
            if(arr[i] < arr[i-increment]) {
                temp = arr[i];
                for(var j = i; j-increment >= 0 && arr[j-increment] > temp; j -= increment) {
                    arr[j] = arr[j-increment];
                }
                arr[j] = temp;
            }
        }
    }
}; 

复杂度分析
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值