排序-插入排序的优化--半插入排序

半插入排序(有时也称为二分查找插入排序)是对传统插入排序的一种优化。基本思想是在执行插入操作时,不是简单地从前向后遍历已排序序列来寻找插入位置,而是使用二分查找法来确定新元素的正确位置,从而减少比较次数,提高效率。虽然这种改进减少了比较操作,但元素的移动次数并未减少,因此整体时间复杂度仍然是O(n^2)。

半插入排序的步骤如下:

  1. 初始化:数组中第一个元素自成一个有序区,从第二个元素开始处理。

  2. 查找插入位置

    • 对于每个待插入元素,使用二分查找法在已排序的子序列中确定其正确的位置。二分查找从有序区的两端开始,逐步缩小范围,直到找到待插入元素应该插入的位置。
  3. 插入操作

    • 找到插入位置后,将待插入元素移动到该位置。如果该位置已经有元素,需要将该位置及其后面的元素向后移动一位,为新元素腾出空间。
  4. 重复步骤2和3,直到所有元素都被处理完,数组完全有序。

优化效果分析:

  • 优点
    • 减少了比较的次数,特别是对于大数组,二分查找相比线性查找能显著提高效率。
  • 缺点
    • 虽然比较次数减少,但元素的移动次数并没有减少,因此整体上对于时间复杂度的改善有限,依然是O(n^2)。
    • 引入了二分查找的逻辑,使得算法实现相对复杂。

半插入排序的优化主要体现在比较操作上,对于数据移动密集型的场景,这种优化的提升效果有限。在实际应用中,这种优化更多地作为一种教学示例,展示如何结合不同算法思想进行优化,而对于大规模数据排序,通常还是会选择更高效的算法,如快速排序、归并排序等。

以下是实现半插入排序的Java代码

public class BinaryInsertionSort {// 二分查找方法,返回要插入的位置private static int binarySearch(int[] arr, int key, int start, int end) {while (start <= end) {int mid = start + (end - start) / 2;if (arr[mid] == key) {return mid;} else if (arr[mid] < key) {start = mid + 1;} else {end = mid - 1;}}return start; // 插入位置}// 半插入排序主方法public static void binaryInsertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int key = arr[i];int j = i - 1;// 使用二分查找找到key的插入位置int insertIndex = binarySearch(arr, key, 0, j);// 将key及其前面的元素向后移动一位while (j >= insertIndex) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}// 主函数测试排序效果public static void main(String[] args) {int[] arr = {5, 8, 4, 9, 1, 3, 2, 7, 6};System.out.println("Original array: ");for (int value : arr) {System.out.print(value + " ");}System.out.println();binaryInsertionSort(arr);System.out.println("Sorted array: ");for (int value : arr) {System.out.print(value + " ");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MSMQ消息队列

MQ是一种企业服务的消息中间节技术&#xff0c;这种技术常常伴随着企业服务总线相互使用&#xff0c;构成了企业分布式开发的一部分&#xff0c;如果考虑到消息的发送和传送之间是可以相互不联系的并且需要分布式架构&#xff0c;则可以考虑使用MQ做消息的中间价技术&#xff0…

Java高级开发2024高频面试提问题目

1、请先简单自我介绍一下自己&#xff1f;&#xff08;一般不超过5min&#xff09; 2、你最熟悉的项目是哪一个&#xff0c;讲一下用了哪些技术栈&#xff1f;&#xff08;尽量讲出系统架构图使用到的技术组件和为什么选型这个组件&#xff1f;&#xff09; 3、你项目中使用什…

如何给远程服务器配置代理

目录 前言 正文 更换镜像源 开始之前 安装过程 遇到的问题 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4…

TFN CK1840B 喇叭天线 定向 18GHz~40GHz

沃比得 CK1840B 喇叭天线 定向 18GHz~40GHz 产品概述 沃比得 CK1840B喇叭天线工作频率为 18GHz~40GHz。具有频带宽&#xff0c; 性能可靠&#xff0c; 增益高等优 点&#xff0c; 是理想的 EMC 测试、电子对抗等领域的定向接收、发射天线。 应用领域 ● 电子对抗领域 ● EM…

NPDP考完后多久出结果?(内附查成绩流程)

NPDP全称为New Product Development Professional&#xff0c;也叫产品经理国际资格认证。为了获得NPDP认证&#xff0c;不少人都在报考NPDP考试&#xff0c;那么NPDP考试一般多长时间出成绩呢&#xff1f; NPDP考试成绩查询时间&#xff1a; 一般在考试结束后的4-6周左右进行…

IT服务台的演变趋势

在技术进步和用户期望变化的推动下&#xff0c;IT服务台正在经历重大变化。IT服务台的未来将主要受到以下趋势的推动&#xff1a; 先进的人工智能和认知技术 预计高级人工智能 &#xff08;AI&#xff09; 和认知技术在 IT 服务台中的集成度会更高。通过将 IT 服务台集成到 IT…

Matlab简介应用和绘制函数图像教程具体案例

MATLAB是由美国MathWorks公司出品的商业数学软件,其名称是matrix & laboratory两个词的组合,意为“矩阵工厂(或矩阵实验室)”。MATLAB主要用于算法开发、数据可视化、数据分析以及数值计算等领域,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一…

PMC高手如何玩转跨部门协作?让团队和谐共生

PMC&#xff08;生产与物料控制&#xff09;作为连接生产与供应链的关键部门&#xff0c;其与其他部门之间的协作关系显得尤为重要。本文&#xff0c;深圳天行健精益管理咨询公司分享具体方法如下&#xff1a; 首先&#xff0c;PMC需要明确自己的角色定位。作为生产与供应链之间…

Ubuntu 系统中设置中文输入法

在 Ubuntu 系统中设置中文输入法&#xff0c;通常涉及以下几个步骤&#xff1a; 添加中文语言支持&#xff1a; 打开系统设置&#xff08;Settings&#xff09;&#xff0c;选择“Region & Language”。点击“Manage Installed Languages”&#xff0c;搜索并安装“Chinese…

Flutter不常用组件----IntrinsicHeight,IntrinsicWidth

终于有勇气做一些不常用组件的博文&#xff0c;最近行情不景气&#xff0c;大家的工作应当也是不少&#xff0c;笔者也是一样。之前筹备了好久想着做一些不常用的组件分享&#xff0c;一直没付诸于行动。现在打算开始慢慢做起来&#xff0c;各位粉丝如果有是一些使用场景代码繁…

Redis经典问题:数据并发竞争

大家好,我是小米!今天我们要聊的话题是在大流量系统中常见的一个问题:数据并发竞争。不管是火车票系统还是微博系统,一旦出现数据并发竞争,都可能导致用户体验下降,甚至系统崩溃。那么,我们该如何解决这个问题呢?让我们一起来深入探讨! 数据并发竞争 当我们谈论大流…

代码随想录:长度最小的子数组相关题目推荐(904、76)

904.水果成篮 题目 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须…

三. TensorRT基础入门-ONNX注册算子的方法

目录 前言0. 简述1. 执行一下我们的python程序2.转换swin-tiny时候出现的不兼容op的例子3. 当出现导出onnx不成功的时候&#xff0c;我们需要考虑的事情4. unsupported asinh算子5. unsupported deformable conv算子总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战…

MR混合现实情景实训教学系统在室内设计课堂上的应用

MR混合现实情景实训教学系统在室内设计课堂上的应用可以带来许多积极的影响&#xff0c;包括提高学生的参与度、增强学生的实践技能、以及提供更真实和全面的学习体验。 首先&#xff0c;MR混合现实情景实训教学系统能够创建出一种沉浸式的环境&#xff0c;使学生能够直接接触到…

EmotiVoice 实时语音合成TTS

参考:https://github.com/netease-youdao/EmotiVoice 测试整体速度可以 docker安装: 运行容器:默认运行了两个服务,8501 一个streamlit页面,另外8000是一个api接口服务 docker run -dp 8501:8501 -p 8250:8000 syq163/emoti-voice:latest ##gpu运行 docker run --gpus a…

前端页面 贴边拖拽 盒子

vue 悬浮球(带自动吸附功能)_vue悬浮球-CSDN博客

windows内存管理-检查内存可用性

在驱动程序开发中&#xff0c;对内存的操作要格外小心。如果某段内存是只读的&#xff0c;而驱动程序试图去写操作&#xff0c;会导致系统的崩溃。同样&#xff0c;当某段内存是不可读的情况下&#xff0c;驱动程序试图去读&#xff0c;同样会导致系统的崩溃。 DDK提供了两个函…

第四届微调——炼丹

学习地址&#xff1a;Tutorial/xtuner/README.md at main InternLM/Tutorial GitHub 笔记 微调是一种在已有的预训练模型基础上&#xff0c;通过使用新的数据对模型进行进一步优化和调整的技术手段。它的目的是使模型能够更好地适应特定的应用场景和任务需求&#xff0c;进一…

基础ArkTS组件:帧动画,内置动画组件,跑马灯组件(HarmonyOS学习第三课【3.6】)

帧动画 帧动画也叫序列帧动画&#xff0c;其原理就是在时间轴的每帧上逐帧绘制不同的内容&#xff0c;使其连续播放而成动画。ArkUI开发框架提供了 ImageAnimator 组件实现帧动画能力&#xff0c;本节笔者介绍一下 ImageAnimator 组件的简单使用。 官方文献 说明 该组件从A…

9. SVG中的text元素

SVG (Scalable Vector Graphics) 提供了强大的文本渲染能力&#xff0c;其中<text>元素是常用 的文本操作的元素。本文将详细介绍<text>标签的基本使用方法&#xff0c;并展示如何通过<tspan>和<textPath>增强文本的表现力。 <text>标签基础 &…