当前位置: 首页 > news >正文

查找与排序-插入排序

思考:在把待排序的元素插入已经有序的子序列中时,是不是一定要逐一比较?有没有改进方法?

在查找插入位置的时候可以采用折半(二分)搜索的办法。

一、折半插入排序

1.折半插入排序算法的基本思想

假设待排序的n个数据元素存放在数组a中,那么折半插入排序可做如下描述:  

(1)初始条件,有序子序列中只有一个元素a[0];  

(2)从a[1]开始,对于每次要插入的数据元素a[i],使用折半查找法,查找a[i] 在已经有序的序列中的插入位置,然后进行插入。  

(3)循环n-1次,直到所有元素都插入到有序序列中,算法结束。

2.折半插入排序代码

def bin_insertion_sort(self):data_len = len(self.data)for i in range(1, data_len):if self.data[i] < self.data[i - 1]:low = 0high = i - 1temp =self.data[i]while low <= high:mid = (low + high) // 2if temp < self.data[mid]:high = mid - 1else:low = mid + 1j = i - 1while j >= low:self.data[j + 1] = self.data[j]j = j - 1self.data[low] = temp

3.折半插入排序举例

例:设待排元素序列为{16,15,19,16,18,19,20,14},请给出折半插入排序算法按关键字递增排列。

4.折半插入排序算法分析 

(1)空间复杂度:折半插入排序与直接插入排序一样,空间上只需要一个记录大小的辅助空间来临时存放待插入记录,空间复杂度为O(1)。      

(2)时间复杂度:折半插入排序这种改进考虑了数据元素的比较次数。要插入a[i]时,要在长度为i的有序序列中查找位置,因此综合起来,总的比较次数nlog2n。但是折半插入排序并没有减少数据元素移动的次数,因此,其时间复杂度仍然是O(n2)。      

(3)其他方面:折半查找只能用于顺序结构存储的序列,当初始记录无序性强,数据元素个数较多时效率较高,是一种稳定的排序方法。

二、希尔排序

1.希尔算法的基本思想

(1)把数据元素按照增量分为若干个小组,对每个小组内元素利用直接插入排序进行排序。 (2)通过分组,使得每次利用直接插入排序的元素个数降低;

(3)通过每次组内排序,使得整个序列趋向于有序。

(4)每趟排序过后,再按照新的更小的增量进行上述过程,直至增量为1,所有数据元素都在一个小组内排序后算法结束。

2.希尔排序举例

例:设待排元素序列为{56,25,70,99,82,10,15,56,42,18 },取增量序列为{5,3,1},请给出希尔排序法进行排序的过程。

3.希尔排序代码

def shell_sort(self):data_len = len(self.data)gap = data_lenwhile True:gap = gap // 3 + 1      # 保证增量递减且最后为1for i in range(gap, data_len):temp = Record(self.data[i].key, self.data[i].value)j = i-gapwhile j >= 0 and temp.key < self.data[j].key:self.data[j+gap].key = self.data[j].keyj = j-gapself.data[j + gap] = tempif gap == 1:break

4.希尔排序算法分析

(1)空间复杂度:也需要一个数据元素空间,其空间复杂度为O(1)。      

(2)时间复杂度:希尔排序的时间复杂度分析是个非常复杂的问题,因为其性能与所选增量序列有关(介于O(n)和O(n2)之间)。      

(3)希尔排序算法是不稳定算法。

相关文章:

查找与排序-插入排序

思考&#xff1a;在把待排序的元素插入已经有序的子序列中时&#xff0c;是不是一定要逐一比较&#xff1f;有没有改进方法&#xff1f; 在查找插入位置的时候可以采用折半&#xff08;二分&#xff09;搜索的办法。 一、折半插入排序 1.折半插入排序算法的基本思想 假设待…...

JAVA基础:多线程 (学习笔记)

多线程 一&#xff0c;什么是线程&#xff1f; 程序&#xff1a;为完成特定任务、用某种语言编写的一组指令的集合,是一段静态的代码进程&#xff1a;程序的一次执行过程。 正在运行的一个程序&#xff0c;进程作为资源分配的单位&#xff0c;在内存中会为每个进程分配不同的…...

盲盒小程序/APP系统,市场发展下的新机遇

当下&#xff0c;年轻人热衷于各种潮玩商品&#xff0c;尤其是一盲盒为主的潮流玩具风靡市场&#xff0c;吸引了众多入局者。随着互联网信息技术的快速发展&#xff0c;各类线上盲盒小程序又进一步推动了盲盒市场的发展&#xff0c;成为年轻人拆盲盒的主要阵地。在盲盒经济中&a…...

Unity3D LayoutGroup组件详解

Unity3D中的LayoutGroup组件是一种强大的工具&#xff0c;用于动态调整UI元素的布局。它主要包括三种类型&#xff1a;Horizontal Layout Group&#xff08;水平布局组&#xff09;、Vertical Layout Group&#xff08;垂直布局组&#xff09;和Grid Layout Group&#xff08;网…...

[NeetCode 150] Foreign Dictionary

Foreign Dictionary There is a foreign language which uses the latin alphabet, but the order among letters is not “a”, “b”, “c” … “z” as in English. You receive a list of non-empty strings words from the dictionary, where the words are sorted lex…...

小新学习K8s第一天之K8s基础概念

目录 一、Kubernetes&#xff08;K8s&#xff09;概述 1.1、什么是K8s 1.2、K8s的作用 1.3、K8s的功能 二、K8s的特性 2.1、弹性伸缩 2.2、自我修复 2.3、服务发现和负载均衡 2.4、自动发布&#xff08;默认滚动发布模式&#xff09;和回滚 2.5、集中化配置管理和密钥…...

如何用终端批量修改一个文件夹里面所有图片的后缀名?

步骤&#xff1a; winr &#xff0c;然后输入cmd,打开终端 使用cd命令导航到要修改图片后缀名的文件夹。eg.我的该文件夹(C:\dog)下&#xff0c;保存的图片。&#xff08;cd和文件目录之间要有空格&#xff09;批量改变后缀名&#xff0c;假如让后缀名全部要从 ".webp&q…...

关于AI网络架构的文章

思科OCP anounce了800G 51.2T G200-based minipack3 switch。对比之前Tesla anounce的TTPoE。真的很好奇&#xff0c;谁是AI-networking的未来&#xff0c;以及思科是否走在正确的路上&#xff0c;以及S1背后的技术。 大致浏览了相关的文章&#xff0c;先mark住&#xff0c;回…...

【ChatGPT】在多轮对话中引导 ChatGPT 保持一致性

在多轮对话中引导 ChatGPT 保持一致性 多轮对话是与 ChatGPT 等对话模型互动时的一大特点&#xff0c;特别是在复杂任务和长时间对话中&#xff0c;保持对话的一致性显得尤为重要。用户往往希望 ChatGPT 能够在上下文中理解先前的对话内容&#xff0c;避免反复重申问题或者给出…...

【Chapter 7】因果推断中的机器学习:从T-学习器到双重稳健估计

随着机器学习技术的发展&#xff0c;数据科学家们开始探索如何将这些先进的方法应用于因果推断问题&#xff0c;尤其是处理异质性效应&#xff08;Effect Heterogeneity&#xff09;时。本章将介绍几种基于机器学习的因果推断方法&#xff0c;包括T-学习器、X-学习器和双重稳健…...

vim的使用方法

常见的命令可参考&#xff1a; Linux vi/vim | 菜鸟教程​www.runoob.com/linux/linux-vim.html​编辑https://link.zhihu.com/?targethttps%3A//www.runoob.com/linux/linux-vim.html 1. vim的工作模式 vi/vim 共分为三种模式&#xff0c;命令模式、编辑输入模式和末行&am…...

OPPO携手比亚迪共同探索手机与汽车互融新时代

10月23日&#xff0c;OPPO与比亚迪宣布签订战略合作协议&#xff0c;双方将共同推进手机与汽车的互融合作&#xff0c;这一合作也标志着两大行业巨头在技术创新和产业融合上迈出了重要一步&#xff0c;为手机与汽车的深度融合探索新的可能。 OPPO创始人兼首席执行官陈明永、OP…...

Apache Linkis:重新定义计算中间件

在大数据技术蓬勃发展的今天&#xff0c;我们见证了从单一计算引擎到多元化计算范式的演进。然而&#xff0c;随着企业数据应用场景的日益丰富&#xff0c;一个严峻的挑战逐渐显现&#xff1a;如何有效管理和协调各类计算引擎&#xff0c;使其能够高效协同工作&#xff1f;Apac…...

go gorm简单使用方法

GORM 是 Go 语言中一个非常流行的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许开发者通过结构体来定义数据库表结构&#xff0c;并提供了丰富的 API 来操作数据库。 安装 go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite表结构 在 gorm 中定义表结…...

【c++高级篇】--多任务编程/多线程(Thread)

目录 1.进程和线程的概念&#xff1a; 1.1 进程&#xff08;Process&#xff09;&#xff1a; 1.2线程&#xff08;Thread&#xff09;&#xff1a; 1.3 对比总结&#xff1a; 2.多线程编程&#xff1a; 2.1 基于线程的多任务处理&#xff08;Thread&#xff09;&#xf…...

【力扣专题栏】两数相加,如何实现存储在链表中的整数相加?

题解目录 1、题目描述解释2、算法原理解析3、代码编写&#xff08;原始版本&#xff09;4、代码编写&#xff08;优化版本&#xff09; 1、题目描述解释 2、算法原理解析 3、代码编写&#xff08;原始版本&#xff09; /*** Definition for singly-linked list.* struct ListN…...

SOLID - 接口隔离原则(Interface Segregation Principle)

SOLID - 接口隔离原则&#xff08;Interface Segregation Principle) 定义 接口隔离原则&#xff08;Interface Segregation Principle&#xff0c;ISP&#xff09;是面向对象设计中的五个基本原则之一&#xff0c;通常缩写为SOLID中的I。这一原则由Robert C. Martin提出&…...

arrylist怎么让他变得不可修改

在Java中&#xff0c;要将一个 ArrayList变得不可修改&#xff0c;你可以使用以下几种方法&#xff1a; ###1. 使用 Collections.unmodifiableList Java 提供了 Collections.unmodifiableList 方法&#xff0c;可以生成一个不可修改的视图。这种方式返回的列表将不允许添加、…...

SpringMVC实战(3):拓展

四、RESTFul风格设计和实战 4.1 RESTFul风格概述 4.1.1 RESTFul风格简介 RESTful&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;用于设计网络应用程序和服务之间的通信。它是一种基于标准 HTTP 方法的简单和轻量级的通信协议&…...

Vue应用中使用xlsx库实现Excel文件导出的完整指南

Vue应用中使用xlsx库实现Excel文件导出的完整指南 在现代Web开发中&#xff0c;经常需要将数据导出为Excel文件&#xff0c;以便于用户进行离线分析或记录。Vue.js作为一个轻量级且高效的前端框架&#xff0c;结合xlsx库可以轻松实现这一功能。本文将详细介绍如何在Vue应用中使…...

OpenClaw调试技巧:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF任务失败排查手册

OpenClaw调试技巧&#xff1a;Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF任务失败排查手册 1. 问题定位的基本框架 当OpenClaw任务执行失败时&#xff0c;我通常会按照"环境-模型-日志"三层结构进行排查。上周在调试一个自动化周报生成任务时&#xff0…...

国内免费AI编程工具推荐

DeepSeek Code 由深度求索公司开发&#xff0c;支持代码生成、补全和错误检测&#xff0c;涵盖Python、Java等多种语言&#xff0c;提供网页版和插件形式。CodeGeeX 清华大学团队推出的多语言代码生成工具&#xff0c;支持VS Code等IDE插件&#xff0c;具备代码翻译和解释功能。…...

8个智能脚本,让Illustrator设计效率提升10倍

8个智能脚本&#xff0c;让Illustrator设计效率提升10倍 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 设计效率的隐形杀手&#xff1a;你是否也在重复劳动&#xff1f; 每天花费…...

FPGA实战避坑:手把手教你用Verilog搞定跨时钟域信号传输(附同步/异步FIFO完整代码)

FPGA实战避坑&#xff1a;手把手教你用Verilog搞定跨时钟域信号传输 第一次在FPGA项目里遇到跨时钟域问题&#xff0c;我盯着屏幕上那些随机跳变的数据波形&#xff0c;整整三天没想明白问题出在哪。当时我正在做一个工业传感器数据采集系统&#xff0c;处理器接口跑在100MHz&a…...

OpenClaw隐私保护:QwQ-32B本地化部署数据边界控制

OpenClaw隐私保护&#xff1a;QwQ-32B本地化部署数据边界控制 1. 为什么需要关注OpenClaw的数据边界 去年我在帮一个法律团队搭建自动化文档处理系统时&#xff0c;第一次深刻意识到数据边界的重要性。他们处理的案件材料包含大量敏感信息&#xff0c;任何数据泄露都可能造成…...

Arduino轻量级XXH32哈希库:高吞吐低内存嵌入式校验方案

1. XxHash_arduino 库概述 XxHash_arduino 是一个专为 Arduino 平台优化的轻量级哈希算法库&#xff0c;基于 Yann Collet 开发的 xxHash 算法实现。该库于 2022 年 4 月由嵌入式爱好者 atesin 完成移植&#xff0c;采用 GPLv3 许可协议&#xff0c;同时兼容原始 xxHash 的算法…...

这家口腔机构,如何用AI把到院成本从1200+打到310元?

广东有一家口腔机构&#xff0c;三级专科&#xff0c;种植体量在区域排前三。 听起来很牛吧&#xff1f;但老板跟我聊天的时候&#xff0c;愁得不行。他说&#xff0c;抖音投放成本飘高&#xff0c;线索到院率低&#xff0c;客服人手不足&#xff0c;加微后无差别群发&#xff…...

Qwen3-TTS声音克隆部署全攻略:简单3步,开启你的语音克隆之旅

Qwen3-TTS声音克隆部署全攻略&#xff1a;简单3步&#xff0c;开启你的语音克隆之旅 想不想让一段普通的文字&#xff0c;用你指定的声音说出来&#xff1f;比如&#xff0c;用你自己的声音给视频配音&#xff0c;用朋友的声音讲个笑话&#xff0c;或者用某个角色的声音朗读一…...

NoFences:重构桌面空间的区域化引擎

NoFences&#xff1a;重构桌面空间的区域化引擎 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 副标题&#xff1a;三步打造个性化桌面系统 痛点分析&#xff1a;你的桌面是…...

vLLM-v0.17.1镜像部署实战:从零开始搭建大模型推理服务

vLLM-v0.17.1镜像部署实战&#xff1a;从零开始搭建大模型推理服务 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;它通过创新的内存管理和批处理技术&#xff0c;显著提升了LLM的推理效率和服务吞吐量。这个项目最初由加州大学伯克利…...