JavaScript——插入排序、堆排序

2023-11-03

一、插入排序

插入排序是一种简单直观的排序算法,它比冒泡排序 、选择排序都更有效率。

基本思路:

        插入排序的工作原理是通过构建有序序列,对于未排序元素,在已排序序列中从后向前扫描,找到对应的位置并插入。

        插入排序将数组分成“已排序”和“未排序”两部分,开始时“已排序”部分只有一个元素,然后将它后面一个元素从“未排序”部分插入到“已排序”部分中,这样,“已排序”部分增加一个元素,“未排序”部分减少一个元素。再重复该操作,直到完成全部元素的排序。

以对数组[4,3,5,1,2]进行从小到大排序为例,步骤如下:

①假定第一个元素是已排序元素,则将数组分成[4]和[3,5,1,2]这两个部分,前者是已排序部分,后者是未排序部分;

②取出未排序部分的第一个元素“3”(即前面提到的已排序部分后面一个元素),与已排序部分最后一个元素“4”比较,3<4,所以3排在4前面,数组变成[3,4]和[5,1,2]两部分;

③重复步骤②,取出未排序部分第一个元素“5”,与已排序部分最后一个元素“4”进行比较,5>4,所以5排在4后面,数组变成[3,4,5]和[1,2]两部分。

④重复步骤②,取出未排序部分第一个元素“1”,与未排序部分最后一个元素“5”比较,1<5,所以1排在5前面,继续与未排序部分倒数第二个元素“4”比较,1<4,所以1排在4前面,继续与未排序部分倒数第三个元素“3”比较,1<3,所以1排在3前面,数组变成[1,3,4,5]和[2]两部;

⑤重复步骤②,取出未排序第一个元素“2”,与未排序部分最后一个元素“5”比较,2<5,所以2排在5前面,继续与未排序部分倒数第二个元素“4”比较,2<4,所以2排在4前面,继续与未排序部分倒数第三个元素“3”比较,2<3,所以2排在3前面,继续与未排序部分倒数第四个元素“1”比较,2>1,所以2排在1后面,数组变成[1,2,3,4,5],整个排序过程结束。

时间复杂度:O(n^{2})

例:对数组[38,26,89,56,17,44]所有元素进行从小到大排序。

代码实现:

function insertSort(arr){

    var len = arr.length;   //数组的长度

    var temp;    //当前比较的值

    var i,j;      //分别是未排序和已排序数组的当前位置

    for(i=1;i<len;i++){

        j = i-1;

        temp = arr[i];

        while(j>=0 && arr[j]>temp){

            arr[j+1] = arr[j];

            j--;

        }

        arr[j+1] = temp;

    }

    return arr;

}

var arr = [38,26,89,56,17,44];

console.log("插入排序前的数组是:",arr);

arr = insertSort(arr);

console.log("插入排序后的数组是:",arr);

实现效果如下:

二、堆排序

堆排序是指利用”堆“这种数据结构所设计的一种排序算法。堆是一个二叉树,分为最大堆和最小堆。最大堆代表除了根节点以外的所有节点,其结点的值小于等于其父节点,堆中的最大元素存放于根节点中,最小堆与之相反,例如下图。

堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或大于)它的父节点。

完全二叉树:从根节点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐。

基本思路:

以从小到大排序规则为例,先将初始待排列序列(R1,R2,…,Rn)构建成最大堆,此堆为初始的无序区;

再将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区和新的有序区,且满足R[1,2,…,n-1]<=R[n];

由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

时间复杂度:O(nlogn)

例:对数组[38,26,89,56,17,44]所有元素进行从小到大排序。

代码实现:

建立最大堆的函数:

// 因为声明的多个函数都需要数据长度,所以把len设置成为全局变量

var len;

//建立最大堆(大顶堆),其实就是对arr数组做一个结构调整,使其具有堆的特性

function buildMaxHeap(arr){

    len = arr.length;

    for(var i=Math.floor(len/2);i>=0;i--){

        heapify(arr,i);

    }

}

调整数组成为最大堆的函数: 

//堆调整函数,即调整当前arr数组为最大堆

function heapify(arr,i){

    var left = 2*i+1;

    var right = 2*i+2;

    var largest = i;

    if(left<len && arr[left]>arr[largest]){

        largest = left;

    }

    if(right<len && arr[right]>arr[largest]){

        largest = right;

    }

    if(largest !== i){

        swap(arr,i,largest);

        heapify(arr,largest);

    }

}

数组元素交换函数: 

//交换函数

function swap(arr,i,j){

    var temp = arr[i];

    arr[i] = arr[j];

    arr[j] = temp;

}

堆排序函数: 

//堆排序函数

function heapSort(arr){

    buildMaxHeap(arr);

    for(var i=arr.length-1;i>0;i--){

        swap(arr,0,i);

        len--;

        heapify(arr,0);

    }

    return arr;

}

本例中的测试函数: 

//测试

var arr = [38,26,89,56,17,44];

var len = arr.length;

console.log("堆排序前的数组是:",arr);

arr = heapSort(arr);

console.log("堆排序后的数组是:",arr);

实现效果如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript——插入排序、堆排序 的相关文章

随机推荐

  • Vue这些修饰符节省20%的开发时间

    Vue这些修饰符帮我节省20 的开发时间 作者 李大雷 https segmentfault com a 1190000016786254 为了方便大家写代码 vue js给大家提供了很多方便的修饰符 比如我们经常用到的取消冒泡 阻止默认事
  • 滑窗优化——边缘化

    文章目录 一 从高斯分布到信息矩阵 1 1 SLAM 问题概率建模 1 2 SLAM 问题求解 1 3 高斯分布和协方差矩阵 1 4 样例 1 4 1 样例1 1 4 2 样例2 二 舒尔补应用 边际概率 条件概率 2 1 舒尔补的概念 2
  • 2021年Android开发的前景如何?

    前言 安卓已死的论调已经出现很久了 随着去年裁员潮的出现 这种论调更加疯狂 现在的安卓生态 已经发展的非常好 但由于安卓原生开发的局限性 速度慢 无法跨平台 成本高 导致跨平台开发一直是资本家追逐的目标 这才导致RN Weex Flutte
  • SpringBoot配置logback-spring.xml日志

    在SpringBoot新建 logback spring xml 配置文件 因为SpringBoot官方是推荐这个方式 内容 拷贝复制下来就可以了
  • nvm1.1.10使用bug记录及低级解决方法

    意外发现nvm安装了node10 15 3版本后 并且切换到该版本后 会导致nvm其他版本切换失败 按照实训要求要使用vue2进行web应用开发 需安装node10 15 3版本 好吧 还好之前搞了nvm可以随意切换node版本 没关系 当
  • 怎样学好数据结构

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 6 1 数据结构学习思路 1 数据结构是计算机专业最重要最基础的一门课 对于有过编程经验的人 结合自己的编程体会去领悟它的思想 对于初学者 选
  • 关于java四舍五入时遇五不进位的问题

    在数据处理的过程中 碰到了保留小数点两位和四舍五入的问题 首先也是百度了网上的方法 double a DecimalFormat df new DecimalFormat df setRoundingMode RoundingMode HA
  • 吐血整理,Jenkins配置邮件发送测试报告持续集成,看这一篇就够了...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • caused by: java.lang.ClassNotFoundException: org.springframework.transaction.ReactiveTransactionMana

    SpringBoot启动时报错如下 Java包冲突问题解决 Dspring application admin enabled true javaagent C Program Files JetBrains IntelliJ IDEA 2
  • kafka学习笔记

    1 kafka是什么 kafka是一个高吞吐 分布式 基于发布 订阅的消息系统 最大的特性就是可以实时的处理大量的数据以满足各种需求场景 日志收集 离线和在线的消息消费 等等 2 kakfa的基础架构 topic 主题 kafka根据top
  • 数组和链表的区别

    数组是将元素在内存中连续存放 由于每个元素占用内存相同 可以通过下标迅速访问数组中任何元素 但是如果要在数组中增加一个元素 需要移动大量元素 在内存中空出一个元素的空间 然后将要增加的元素放在其中 同样的道理 如果想删除一个元素 同样需要移
  • 关于request.getinputStream读取一次的问题研究

    public int substract byte src int off int len throws IOException if end start 0 if in null return 1 重点 进行流读取标识 读到末尾 会返回
  • 只有技术人才能看懂的幽默

    面试官 请写出一段体现你水平的代码 我 sudo rm rf 面试官 这体现了你哪方面能力 我 我大学田径队的 1 程序有问题时不要担心 如果所有东西都没问题 你就失业了 2 计算机系的男同学追班里一女同学 结果此女总是躲躲闪闪 男的看没戏
  • swagger3.0访问后台地址

    swagger3 0访问后台地址 最近在学SpringBoot 其中swagger部分 发现后台地址不能访问了 当时导入的坐标为 这个是Gradle坐标 和Maven差不多 compile group io springfox name s
  • 计算机视觉基础7

    语义分割 从像素 pixel level 水平上 理解识别图片的内容 根据语义信息分割 输入 图片 输出 同尺寸的分割标记 每个像素会被识别为一个类别 FCN全卷积网络 所有层都是卷积层 相对位置保持不变 解决降采样后的低分辨率问题 全卷积
  • input类型

    下面通过设置input元素的type属性来演示不同类型的文本框的用法 效果图 当输入不正确的邮箱号 点击提交时 如下图 当输入不正确的网址 点击提交时 如下图 当输入不正确的手机号 点击提交时 如下图 代码如下
  • 不同的人每天工作有什么不同

    Author Skatexg Time 2020 07 17 不同的人每天工作有什么不同 有的人在为完成任务付出劳动 有的人在为有意义的成果付出劳动 为完成任务而付出的劳动是无意义的 只有产生成果的劳动才是有意义的 公司花钱买的是劳动成果
  • UPF learing2:set_level_shifter

    set level shifter 设置level shifter strategy在实现的过程中 level shifter name domain domain name elements list exclude elements l
  • python:10个小孩围成一圈分糖果

    10个小孩围成一圈分糖果 老师顺次分给每个人的糖果数为12 2 8 22 16 4 10 6 14 20 然后按以下规则调整 所有小孩同时把自己的糖果分一半给右边的小孩 糖果数如果变为奇数的人 再向老师补要一块 那多少次调整后 大家的糖果数
  • JavaScript——插入排序、堆排序

    一 插入排序 插入排序是一种简单直观的排序算法 它比冒泡排序 选择排序都更有效率 基本思路 插入排序的工作原理是通过构建有序序列 对于未排序元素 在已排序序列中从后向前扫描 找到对应的位置并插入 插入排序将数组分成 已排序 和 未排序 两部