js 实现插入排序算法(希尔排序算法)

插入排序是一种简单直观的排序算法。主要方法就是从数组值一个一个取出进行排序。

特性:

  1. 原理简单,代码实现简洁,易于理解和手写;
  2. 对小规模数据(n<100)和基本有序的数据排序效率极高(接近 O(n) ),优于冒泡排序;
  3. 时间复杂度为 O(n^2) ,数据量大(n>1000),效率急剧下降;
javascript 复制代码
const insertSort = (arr) => {
    for(let i = 1;i < arr.length;i++) {
        const value = arr[i]
        let j = i - 1
        while(j >=0 && arr[j] > value) {
            arr[j+1] = arr[j]
            j--
        }
        arr[j+1] = value
    }
}

const arr = [1100,200,500,1600,25,13,685,23651,0,12,35,478,66,5,3,9,8,456,58,68,95,25,12,45,65,8,78,95,68,321,456,122,258,951,864,57,85,95,96,93,92,94,98,25,26,28,29,68,65,62,67,789,752,751,745,6859,3,20,359,215,687,592]
insertSort(arr)
console.log(arr)

希尔排序(Shell's Sort): 是插入排序的一种改进 算法,又称**"缩小增量排序"**(Diminishing Increment Sort),是Shell在1959年提出的。

javascript 复制代码
const shellSort = (arr) => {
    let n = arr.length
    let gap = Math.floor(n / 2)
    while(gap > 0) {
        for(let i = gap;i < n;i++) {
            const value = arr[i]
            let j = i - gap
            while(j >= 0 && arr[j] > value) {
                arr[j+gap] = arr[j]
                j -= gap
            }
            arr[j+gap] = value
        }
        gap = Math.floor(gap / 2)
    }
}

const arr = [1100,200,500,1600,25,13,685,23651,0,12,35,478,66,5,3,9,8,456,58,68,95,25,12,45,65,8,78,95,68,321,456,122,258,951,864,57,85,95,96,93,92,94,98,25,26,28,29,68,65,62,67,789,752,751,745,6859,3,20,359,215,687,592]
shellSort(arr)
console.log(arr)

gap的取法有多种,Knuth 提出 gap = | gap /3 | + 1 是效果比较好的。

javascript 复制代码
const shellSort = (arr) => {
    let n = arr.length
    let gap = n
    while(gap > 1) {
        gap = Math.floor(gap / 3) + 1
        for(let i = gap;i < n;i++) {
            const value = arr[i]
            let j = i - gap
            while(j >=0 && arr[j] > value) {
                arr[j+gap] = arr[j]
                j -= gap
            }
            arr[j+gap] = value
        }
    }
}

const arr = [1100,200,500,1600,25,13,685,23651,0,12,35,478,66,5,3,9,8,456,58,68,95,25,12,45,65,8,78,95,68,321,456,122,258,951,864,57,85,95,96,93,92,94,98,25,26,28,29,68,65,62,67,789,752,751,745,6859,3,20,359,215,687,592]
shellSort(arr)
console.log(arr)
相关推荐
大侠归来7 小时前
C 语言 | 在函数中操作数组
c语言·c++·算法
怕浪猫12 小时前
GEO 优化到底是什么?AI时代内容创作者必须懂的新技能
算法·面试·github
朝朝辞暮i13 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
Evand J13 小时前
【MATLAB例程】三维RRT+APF避障路径规划与到达角(AOA)定位算法|三维路径优化与定位仿真例程
算法·matlab·路径规划·代码·定位·rrt·aoa
leikooo14 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
weixin_3077791315 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
Ivanqhz15 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
朝朝辞暮i15 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
沙漠之主15 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
朝朝辞暮i15 小时前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法