当前位置: 首页 > 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应用中使…...

5分钟快速上手:qmcdump免费解密QQ音乐文件的终极指南

5分钟快速上手&#xff1a;qmcdump免费解密QQ音乐文件的终极指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否…...

蓝奏云直链解析:从繁琐到一键的下载革命

蓝奏云直链解析&#xff1a;从繁琐到一键的下载革命 【免费下载链接】LanzouAPI 蓝奏云直链&#xff0c;蓝奏api&#xff0c;蓝奏解析&#xff0c;蓝奏云解析API&#xff0c;蓝奏云带密码解析 项目地址: https://gitcode.com/gh_mirrors/la/LanzouAPI 你是否厌倦了蓝奏云…...

大模型上下文长度对Agent的影响:从4K到1M的质变

目录大模型上下文长度对Agent的影响&#xff1a;从4K到1M的质变引言&#xff1a;工作台革命一、上下文窗口演进史&#xff1a;从4K到1M的百倍跃迁1.1 时间线上的技术里程碑1.2 为什么2025年成为“百万Token元年”&#xff1f;二、长上下文的质变&#xff1a;Agent能力的三重跃迁…...

Re:Linux系统篇(九)工具篇 · 一:3分钟学会yum,让软件安装像呼吸一样简单

◆ 博主名称&#xff1a; 晓此方-CSDN博客 大家好&#xff0c;欢迎来到晓此方的博客。 ⭐️Linux系列个人专栏&#xff1a; 【主题曲】Linux ⭐️Re系列专栏&#xff1a;我们思考 (Rethink) 我们重建 (Rebuild) 我们记录 (Record) 文章目录概要&序論一、在 Linux 环境下…...

Narrative-craft:工程化叙事框架的设计、实现与集成指南

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Narrative-craft”&#xff0c;作者是chengjialu8888。光看名字&#xff0c;你可能会觉得这又是一个讲“叙事”或者“故事创作”的抽象工具。但点进去仔细研究后&#xff0c;我发现它远不止于此。这…...

AI编程助手文档自动化:dev-docs-skill实现PRD、API与CHANGELOG高效管理

1. 项目概述&#xff1a;一个为AI编程助手“赋能”的文档自动化工具 如果你和我一样&#xff0c;是个在多个项目间穿梭、既要写代码又要维护文档的开发者&#xff0c;那你一定对“文档债”深恶痛绝。代码写完了&#xff0c;功能上线了&#xff0c;但更新API文档、记录变更日志、…...

从经典工程恶作剧看理论派与实践派的思维碰撞与团队协作

1. 项目概述&#xff1a;一场经典的工程恶作剧及其启示在任何一个技术团队里&#xff0c;总有一些故事会口口相传&#xff0c;成为团队文化的一部分。我今天想分享的这个故事&#xff0c;发生在上世纪80年代初&#xff0c;一个微电路设计小组里。它无关乎高深的技术突破&#x…...

告别SSH命令行:用VSCode的Log Viewer插件实时监控Linux syslog日志(附C程序测试)

告别终端监控&#xff1a;在VSCode中实现Linux系统日志可视化追踪 每次调试服务器应用时&#xff0c;你是否也厌倦了在SSH终端和代码编辑器之间反复切换&#xff1f;那些不断滚动的tail -f输出窗口不仅占用宝贵屏幕空间&#xff0c;还让问题排查变成了一场视觉追踪游戏。对于现…...

iOS模拟器效率革命:Alfred工作流实现键盘流式开发

1. 项目概述与核心价值如果你是一名iOS开发者&#xff0c;或者正在学习Swift或React Native&#xff0c;那么你一定对Xcode自带的iOS模拟器又爱又恨。爱的是它让我们在没有实体设备的情况下也能快速测试应用&#xff1b;恨的是每次想启动模拟器、安装应用、截图或录屏&#xff…...

Python开发进阶之路:探索异步编程与高性能应用

在当今快节奏的软件开发环境中&#xff0c;构建高性能、可扩展的应用程序已成为开发者的首要任务。随着互联网应用的普及&#xff0c;用户对响应速度和并发处理能力的要求越来越高。Python&#xff0c;作为一种广泛使用的高级编程语言&#xff0c;凭借其简洁的语法和强大的生态…...