排序:插入排序算法分析以及相关优化(折半插入排序)

news2024/11/19 14:54:17

1.算法思想︰

每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。

直接插入排序:顺序查找找到插入的位置,适用于顺序表、链表。

2.算法实现

//直接插入排序
void InsertSort(int A[], int n) {
    int i, j, temp;
    for (i = 1; i < n; i++)//将各元素插入已排好序的序列中
        if (A[i] < A[i - 1]) {//若A[i]关键字小于前驱
            temp = A[i];//用temp暂存A[i]
            for (j = i - 1; j >= 0 && A[j] > temp; --j) //检查所有前面已排好序的元素
                A[j + 1] = A[j];//所有大于temp的元素都向后挪位
            A[j + 1] = temp;//复制到插入位置
        }
}

3.算法效率分析

1.空间复杂度

O ( 1 ) O(1) O(1)

2.时间复杂度

时间复杂度:主要来自对比关键字、移动元素若有n个元素,则需要n-1趟处理。

1.最好情况(原本就有序)
共n-1趟处理,每一趟只需要对比关键字1次,不用移动元素。
最好时间复杂度: O ( n ) O(n) O(n)

2.最坏情况(原本为逆序)
第1趟:对比关键字2次,移动元素3次
第2趟:对比关键字3次,移动元素4次

第i趟:对比关键字i+1次,移动元素i2次

最坏时间复杂度: O ( n 2 ) O(n^2) O(n2)

平均时间复杂度: O ( n 2 ) O(n^2) O(n2)

算法稳定性:稳定

4.优化:折半插入排序

1.算法思路

思路:先用折半查找找到应该插入的位置,再移动元素。仅适用于顺序表.

在这里插入图片描述

  1. l o w > h i g h low>high low>high时折半查找停止,应将 [ l o w , i − 1 ] [low, i-1] [low,i1]内的元素全部右移,并将A[0]复制到low所指位置.
  2. A [ m i d ] = = A [ 0 ] A[mid]==A[0] A[mid]==A[0]时,为了保证算法的“稳定性”,应继续在mid所指位置右边寻找插入位置,令 l o w = m i d + 1 low=mid+1 low=mid+1
  3. 最终应将当前元素插入到low所指位置(即high+1)
2.代码实现
//折半插入排序
void InsertSort(int A[], int n) {
    int i, j, low, high, mid;
    for (i = 2; i <= n; i++) {//依次将A[2]~A[n]插入前面的已排序序列
        A[0] = A[i];//将A[i]暂存到A[0]
        low = 1;
        high = i - 1;//设置折半查找的范围
        while (low <= high) {//折半查找(默认递增有序)
            mid = (low + high) / 2;//取中间点
            if (A[mid] > A[0]) high = mid - 1; //查找左半子表
            else low = mid + 1;//查找右半子表
        }
        for (j = i - 1; j >= high + 1; --j)
            A[j + 1] = A[j];//统一后移元素,空出插入位置
        A[high + 1] = A[0];//插入操作
    }
}

比起“直接插入排序”,比较关键字的次数减少了,
但是移动元素的次数没变,整体来看时间复杂度依然是 O ( n 2 ) O(n^2) O(n2)

5.对链表进行插入排序

在这里插入图片描述
移动元素的次数变少了,但是关键字对比的次数依然是 O ( n 2 ) O(n^2) O(n2)数量级,
整体来看时间复杂度依然是 O ( n 2 ) O(n^2) O(n2)

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

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

相关文章

12.InnoDB记录结构

title: “InnoDB记录结构” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” InnoDB记录结构 innoDB存储引擎介绍 存储引擎的作用就是内存和磁盘打…

python随手小练2

题目&#xff1a; 今有物不知其数&#xff0c;三三数之剩二&#xff0c;五五数之剩三&#xff0c;七七数之剩二&#xff0c;为何&#xff1f; &#xff08;即&#xff1a;一个数除3余2&#xff0c;除5余3&#xff0c;除7余2&#xff09; 具体操作&#xff1a; xint(input(&quo…

AI编写文案工具哪些好用且免费

什么是AI编写文案工具&#xff1f;AI编写文案工具基于自然语言处理技术的应用程序&#xff0c;它们旨在协助用户创建各种类型的文案&#xff0c;从广告、营销材料到新闻稿和博客文章&#xff0c;都可以得心应手。这种技术的崛起源于对写作效率和质量的不断追求。 AI编写文案工具…

做销售管理分析需要看哪些关键指标?

做销售管理分析需要看哪些关键指标&#xff1f; 销售管理分析时抓取关键指标&#xff0c;有着能够【分析和判断销售趋势、为销售决策提供数据支持、优化销售流程和客户管理】等的好处 在了解了分析关键指标的目的之后&#xff0c;我们就可以根据企业的需求来确定关键指标&…

淘宝/天猫获得店铺的所有商品 API 返回值说明

淘宝API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范。 通过开放接口&#xff0c;开发者可以不改变现有系统&#xff0c;直接在原有系统上实现新功能。 在开发过程中&#xff0c;使用淘宝API接口可以帮助开发者快速搭建自己的应用&#xff0c;实…

2023年Java毕业设计题目如何选题?Java毕业设计选题大全

大家好&#xff0c;我是程序员徐师兄&#xff0c;最近有很多同学咨询&#xff0c;说毕业设计了&#xff0c;不知道选怎么题目好&#xff0c;有哪些是想需要注意的。 确实毕设选题实际上对很多同学来说一个大坑&#xff0c; 每年挖坑给自己跳的人太多太多。选到合适的题目的话&…

Linux字符设备驱动开发

文章目录 字符设备简单介绍file_operations结构体驱动编译为模块字符设备注册与注销设备的操作函数初始化添加LICENSE和作者信息设备号的分配文件操作函数字符设备驱动示例源文件chrdev.cMakefile文件测试代码app.c编译开发板上验证 字符设备简单介绍 字符设备是Linux驱动中最…

Lua函数

--函数--无参无返回值 function F1()print("F1函数") end F1() print("*****************")--有参 function F2(a)print("F2函数"..a) end F2(2) --如果传入参数和函数数量不一致 --不会报错只是补空 F2(1,2) print("*****************&quo…

iOS应用程序的签名、重签名和安装测试

目录 前言 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 前言 ipa编译出来后&#xff0c;或者ipa进行修改后&#xff0c;需要进行重新签名才能安装到测试手机&#xff0c;或者提交app store供apple 商店审核上架。ipaguard有签名和重签名功能&…

9.21广读最新arxiv论文 思路学习汇总

Towards Generative Modeling of Urban Flow through Knowledge-enhanced Denoising Diffusion 摘要&#xff1a;尽管生成式人工智能在许多领域取得了成功&#xff0c;但在建模地理空间数据方面的潜力仍尚未充分发掘。城市流动&#xff0c;是一种典型的地理空间数据&#xff0c…

单列集合顶层接口Collection

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 集合体系结构 一、单列集合顶层接口Collect…

机器学习小白理解之一元线性回归

关于机器学习&#xff0c;百度上一搜一大摞&#xff0c;总之各有各的优劣&#xff0c;有的非常专业&#xff0c;有的看的似懂非懂。我作为一名机器学习的门外汉&#xff0c;为了看懂这些公式和名词真的花了不少时间&#xff0c;还因此去着重学了高数。 不过如果不去看公式&…

软件推荐:wiztree

简要介绍 近期C盘占满&#xff0c;找到了这款优秀的软件wiztree。 wiztree称得上最快的磁盘空间分析器&#xff0c;界面简洁明晰&#xff0c;操作简单快捷&#xff0c;无广告。 下载地址&#xff1a;https://www.diskanalyzer.com/download 软件截图

Opencv cuda版本在ubuntu22.04中安装办法,解决Could NOT find CUDNN的办法

文章目录 概要下载cuda的runfile版本配置环境变量官网下载cudann安装Opencv依赖包下载opencv和opencv_contrib并解压准备编译安装anaconda环境执行编译命令安装OpenCV并检查是否安装成功 概要 解决以下安装问题&#xff1a; -- Could NOT find CUDNN: Found unsuitable versi…

OpenCascade绘制贝塞尔曲线

贝塞尔曲线有着很多特殊的性质, 在图形设计和路径规划中应用都非常广泛。 贝塞尔曲线完全由其控制点决定其形状, &#xff4e;个控制点对应着&#xff4e;&#xff0d;&#xff11;阶的贝塞尔曲线&#xff0c;并且可以通过递归的方式来绘制。 一阶: 二阶: 高阶&#xff1a; …

雷士、书客、小米的护眼台灯谁的性价比最高?三款护眼台灯真实测评

护眼台灯怎么选一直是许多家长为孩子选台灯时的一个大难题&#xff0c;主要因为市场上的台灯种类太多&#xff0c;而且这些产品中混杂了许多不专业品牌&#xff0c;甚至包括许多劣质台灯和网红品牌&#xff01;同时也经常能够看到报道很多“抽检不合格”的情况发生&#xff0c;…

S08-如何冻结表格行与列

通常表格第一行或第一列的数据都是数据归类的标题 所以比较常用到的是冻结首行首列 具体操作是点击菜单栏的“开始”-“冻结窗格”“冻结首行”

图像语义分割 FCN图像分割网络网络详解

图像语义分割 FCN图像分割网络网络详解 0、介绍1、VGG16网络结构2、转置卷积3、FCN-32S、FCN-16S&#xff0c;FCN-8S网络结构4、损失函数5、膨胀卷积6、FCN(Backbone-ResNet-50)6.1 项目框架6.2 ResNet50网络结构6.3 FCN(Backbone-ResNet-50)网络结构6.4 FCN(Backbone-ResNet-5…

关于接口测试——自动化框架的设计与实现

一、自动化测试框架 在大部分测试人员眼中只要沾上“框架”&#xff0c;就感觉非常神秘&#xff0c;非常遥远。大家之所以觉得复杂&#xff0c;是因为落地运用起来很复杂&#xff1b;每个公司&#xff0c;每个业务及产品线的业务流程都不一样&#xff0c;所以就导致了“自动化…

LVS和keepalived

Keepalived及其工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色的服务器&#x…