js的算法-插入排序(折半插入排序)

news/2024/5/13 2:19:18

直接插入排序的步骤

1. 从前面的有序子表中查找出待插入元素应该被插入的位置

2. 给插入位置腾空间

3. 将待插入元素复制到表中的插入位置。

直接插入排序:边比较边移动;

折半插入排序

先折半查找出元素的待插入位置,然后统一地移动待插入位置之后的所有元素。

基本思想

1. 将待排序序列的第一个元素看做有个有序序列,把第二个元素到最后一个元素看做未排序序列。

2. 从头(第二个元素)到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置;在查找元素的适当位置时,采用折半查找的方式。也就是说,折半查找的是有序序列中合适的位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面)。

演示

只展示一个效果,下次再补充后面的循环;

代码展示

let ary = [3, 8, 1, 9, 4, 5, 6, 2, 7];
/**** @param {*} ary 数组* @param {*} length 长度*/
function halfSort(ary, length) {for (let i = 1; i < length; i++) {// 从第二个元素开始扫描let temp = ary[i];let low = 0,high = i - 1; // 标记有序队列// 折半查找有序子列while (low <= high) {let mid = Math.floor((low + high) / 2);if (ary[mid] > temp) {high = mid - 1;} else {low = mid + 1;}}// 统一移动位置,从后向前移动,腾出位置for (let j = i - 1; j >= high + 1; j--) {ary[j + 1] = ary[j];}ary[high + 1] = temp;console.log("ary", JSON.stringify(ary));}
}
halfSort(ary, ary.length);

结果:

ary [3,8,1,9,4,5,6,2,7]
ary [1,3,8,9,4,5,6,2,7]
ary [1,3,8,9,4,5,6,2,7]
ary [1,3,4,8,9,5,6,2,7]
ary [1,3,4,5,8,9,6,2,7]
ary [1,3,4,5,6,8,9,2,7]
ary [1,2,3,4,5,6,8,9,7]
ary [1,2,3,4,5,6,7,8,9]

性能分析

时间复杂度空间复杂度
最好的时间复杂度O(nlogn);最坏时间复杂度O(n^2)O(1)
平均时间复杂度O(n^2)

总结:

1. 折半插入排序仅仅减少了比较元素的次数,约为O(nlogn);

2. 比较次数与待排序表的初始状态无关,仅仅取决于表中的元素个数n

3. 元素的移动次数并未改变,它依赖与待排序表的初始状态。

4. 折半插入排序是一种稳定的排序方法

5. 只适用于顺序表,不适用链表


http://www.mrgr.cn/p/10276543

相关文章

[NewStarCTF] UnserializeOne __clone魔术方法

今天来个反序列化没见过的魔术方法__clone。 先看源码:点击查看代码 class Start{public $name;protected $func;public function __destruct(){echo "Welcome to NewStarCTF, ".$this->name;}public function __isset($var){($this->func)();} }class Sec{pr…

.net core,.net 6使用SoapCore开发webservice接口,以及使用HttpClientFactory动态访问webservice接口

1.使用soapCore nuget包 2.新建接口及实现 2.1新建接口 2.2新建实现 2.3新建接收实体 2.4返回实体 3.接口注入使用 4.启动程序,直接访问对应的asmx地址本文来自博客园,作者:WantRemake,转载请注明原文链接:https://www.cnblogs.com/SmallChen/p/18163874

Spring Cloud 运维篇1——Jenkins CI/CD 持续集成部署

Jenkins 1、Jenkins是什么&#xff1f; Jenkins 是一款开源 CI/CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测试和部署软件。 Jenkins 支持各种运行方式&#xff0c;可通过系统包、Docker 或者一个独立的 Java 程序。 Jenkins Docker Compose持续集成流…

java实现解析html获取图片或视频url

一、前言 有时在实际项目中&#xff0c;比如发布某篇文章&#xff0c;需要取文章中的某张图片作为封面&#xff0c;那么此时需要文章内容&#xff0c;获取html内容中的图片地址作为封面&#xff0c;下面讲下如何获取html中的图片或视频地址。 二、实现 1.先定义一个工具类&…

关于远程桌面端口的优化措施的建议

在信息技术的世界中&#xff0c;远程桌面连接已成为企业、教育和个人用户之间共享信息、协作工作的重要工具。而这一切的背后&#xff0c;都离不开远程桌面端口&#xff08;RDP&#xff0c;Remote Desktop Protocol Port&#xff09;的支持。RDP端口不仅关乎到远程访问的顺畅性…

Fast-DetectGPT 无需训练的快速文本检测

本文提出了一种新的文本检测方法 ——Fast-DetectGPT&#xff0c;无需训练&#xff0c;直接使用开源小语言模型检测各种大语言模型&#xff0c;如GPT等生成的文本内容。 Fast-DetectGPT 将检测速度提高了 340 倍&#xff0c;将检测准确率相对提升了 75%&#xff0c;超过商用系…

vscode 快捷件的配置文件地址 C:\Users\Reciter\AppData\Roaming\Code\User\keybindings.json

vscode 快捷件的配置文件地址 C:\Users\Reciter\AppData\Roaming\Code\User\keybindings.json 更改快捷键冲突 我要把 Quick Go To Selected File Path 插件的快捷键 Ctrl + E,换成 F12, 插件文章:https://www.cnblogs.com/pengchenggang/p/18163728 但是系统里面已经有好几个…

U盘惊变0字节?别慌,看这里解决你的数据危机!

在日常生活和工作中&#xff0c;U盘已成为我们随身携带重要数据的必备工具。然而&#xff0c;有时我们会遇到一个令人头疼的问题——U盘容量突然显示为0字节。当你发现原本存满文件的U盘一夜之间似乎被清空&#xff0c;显示容量为0字节时&#xff0c;心中的慌乱可想而知。但请不…

技术速递|利用 Redis 使 AI 驱动的 .NET 应用程序更加一致和智能

作者&#xff1a;Catherine Wang 排版&#xff1a;Alan Wang Redis 是一种流行的内存数据存储&#xff0c;可用于解决构建和扩展智能应用程序的关键挑战。在本文中&#xff0c;你将了解如何使用 Redis 的 Azure 缓存来提高使用 Azure OpenAI 的应用程序的效率。 Redis 的 Azur…

asp.net core 多个授权策略选择单个策略

首先假设我们依据官方示例有这样一个自定义的授权handlerpublic class FunAuthorizeAttribute : AuthorizeAttribute, IAuthorizationRequirement,IAuthorizationRequirementData{public FunAuthorizeAttribute() : this(null, true) { }public FunAuthorizeAttribute(string f…

Jenkins - macOS 上安装

文章目录 关于 JenkinsmacOS 上安装 Jenkins方式一&#xff1a;brew方式二&#xff1a;tomcat Jenkins war 关于 Jenkins 官网上下载Jenkins并将其安装到持续集成服务器 https://jenkins.io/download/ macOS 上安装 Jenkins 现在本 macOS 上测试 https://www.jenkins.io/do…

“好记性“和”烂笔头“的密码管理还安全吗?

近日,Bitwarden公司对来自美国、英国、澳大利亚、法国、德国和日本共2400名用户进行了调查,以研究当前用户密码的使用习惯。 调查发现,全球用户普遍缺乏对密码管理安全最佳实践的了解,继续采用高风险的密码管理方法,这导致了大量安全漏洞和数据泄露事件。 调查的重点发现如…

内网渗透-防火墙上线方案

windows防火墙默认规则为入站阻止,出站允许。 场景一:SQL服务器配置了防火墙 在单向防火墙中,攻击机可以使用正向,也可以使用反向上线web服务器,SQL服务器使用反向上线 场景二:WEB服务器配置了防火墙 在此场景中,攻击机需要使用反向来上线WEB服务器,SQL服务器使用正向上…

WEB攻防-.NET特性常见漏洞

目录 前置知识&#xff1a; DLL文件 .NET和DLL文件 C#和DLL文件 关系总结 .NET 配置调试-信息泄露 .NET 源码反编译-DLL 反编译与未授权访问 编译DLL文件 反编译DLL文件 注意事项 案例&#xff1a; 验证代码文件有没有可以绕过&#xff08;Cookie&Session&…

39、BlackRose(VulnHub)

BlackRose 一、nmap二、web渗透 随便看看注册进去 账号:xxxxxx 密码:xxxxxx目录爆破 有很多特殊的目录,不过访问后都重定向了burpsuite改包进admin 查看xxxxxx用户数据包 抓一些xxxxxx用户的一些记录包,看看有什么可用的 signature=&command=id&indexcsrf=3cb58993…

软件测试笔记_习题_面经

软件测试------按测试阶段划分有几个阶段? 单元测试、集成测试、系统测试、验收测试 软件测试------按是否查看源代码划分有几种测试方法? 黑盒、白盒、灰盒 软件测试------按是否运行划分有几种测试方法? 静态测试、动态测试 软件测试------按是否自动化划分有几种测试方…

Elasticsearch集群部署(Linux)

1. 准备环境 这里准备三台Linux虚拟机&#xff0c;用于配置Elasticsearch集群和部署可视化工具Kibana。 角色IP域名集群名称节点名称版本操作系统ES192.168.243.100linux100cluster-eses-node-1007.12.0CentOS 7192.168.243.101linux101cluster-eses-node-101192.168.243.102…

让研发规范管得住 - 我们为什么在流水线之上又做了研发流程?

让研发规范管得住是中大型研发团队的核心诉求,传统的流水线的模式去落地研发规范会存在不少局限。本文将聊聊我们在研发规范落地上的思考、从阿里内部获得的启发以及我们的解决方案。作者:子丑 为什么会有研发规范 很多程序员入职一家新的公司,领完电脑再安装完必备的开发工…

【Linux】基础指令

文章目录 基础指令1. pwd 指令2. cd 指令3. ls 指令4. touch 指令5. mkdir 指令6. rmdir 和 rm 指令7. man 指令8. cp 指令9. mv 指令10. cat 指令11. more 和 less 指令12. head 和 tail 指令13. date 指令14. cal 指令15. find 指令16. grep 指令18. zip 和 unzip 指令19. ta…