c语言经典算法—二分查找,冒泡,选择,插入,归并,快排,堆排

一、二分查找

         1、前提条件:数据有序,随机访问;

         2、实现:递归实现,非递归实现

         3、注意事项:

                循环退出条件:low <=high,low = high.说明还有一个元素,该元素还要与key进行比较

                mid的取值:mid=(low + high)/2;mid = low + ((high - low)>>1)

                low 和high 的更新:low = mid +1;high = mid - 1;不能写成low = mid +1,high = mid-1;又可能出现死循环;

        代码实现:

1、查找第一个与key相等的元素:

2、查找最后一个与key相等的元素

3、查找最后一个小于等于key值的元素

4、查找第一个大于等于key值的元素

二、冒泡排序

        如何评价一个算法:

        1、时间复杂度:最好情况;最坏情况;平均情况;系数和低阶项

        2、空间复杂度:原地排序(特指空间复杂度为O(1))的排序;

        3、稳定性:数据集中“相等”的元素,如果排序前和排序后的相对次序不变,那么这个排序就是稳定的;

        稳定性就是排序算法的很重要的指标;

冒泡排序:

        比较相邻的元素,如果前一个比后一个大,就交换次序,

        对每一对相邻元素做同样的工作,从第一对到最后一对。最大的元素就会位于最后位置;

        除最后一个元素外,对其他元素重复上面的步骤,直到元素的个数为1;

时间复杂度:

        最好情况原数组有序(O(n));

        最坏情况原数组逆序(比较次数(n-1)+(n-2)+...+1 = (n(n-1))/2)

                                           交换次数:((n-1)+(n-2)+...+1  = (n(n-1))/2)

        平均情况(每一种情况出现的情况是相等的):总情况(N!)

                                (比较次数:大于交换的次数,小于(n(n-1))/2)

                                 (交换次数(n(n-1)/4))

分析:有序元素对,逆序元素对,逆序度,有序度;

有序对:34,24,14

逆序对:12,13,23

排序的过程:增加有序度,减少逆序度,最终达到满有序度;

冒泡排序交换导致有序度+1,逆序度-1;

空间复杂度:O(1);//原地排序

稳定性:稳定,arr[j]>arr[j+1]   才发生交换;

三、选择排序(无论什么数据进去都是(O(n2))的时间复杂度,所以用它的时候数据规模越小越好,唯一好处是不占用额外内存)

        工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序中继续寻找最小(大)元素,然后放到已排序序列的末尾,以此类推,直到所有元素均排序完毕;(选择排序不能像冒泡排序一样去优化)

        时间复杂度:O(n2)

                比较次数:(n-1)+ ...+1 =(n(n-1))/2

                交换次数:n-1;

        空间复杂度:O(1)原地排序

        稳定性:不稳定,发生了长距离的交换;

四、插入排序:

        工作原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在从后向前扫描过程中,需要反复把已排序的元素逐步向后挪位,为最新元素提供插入空间;

        时间复杂度:

                最好情况:(O(n))

                                原数组有序(比较次数,(n-1))交换次数:原数组有序(0)

                最坏情况:(O(n2))

                                原数组逆序(比较次数,(n-1)+(n-2)+...+1 = (n(n-1))/2);

交换次数((n-1)+(n-2)+...+1 =(n(n-1))/2:

                平均情况:

                                比较次数:大于交换次数,小于(n(n-1))/2

                                交换次数:(n(n-1))/4(逆序个数)

插入排序好处,当元素基本有序时,其性能非常好;

空间复杂度,O(1),原地排序

稳定性:稳定;

冒泡排序,选择排序,插入排序小结:

        

五、希尔排序(缩小增量排序,插入排序的改进版本):

        第一批打破O(n2)这个时间复杂度的方法;

        gap(希尔):n/2、n/4、...1;

gap = n/2=5

        

先按gap分组,组内使用简单的插入排序(十个元素分为5组);

第一次组间排序完成后,就缩小增量,gap=5/2=2;gap =1;

时间复杂度比O(n2)小,和具体的gap序列相关;

空间复杂度O(1)原地排序;

稳定性:不稳定,会发生长距离交换;

六、归并排序:

        先把大数组分成两个小数组,直到有序再合并;单个数组已经算是有序的;

用递归解决;

        

注意释放堆区数组

        

七、快速排序

        从数列中挑出一个元素,称为“基准”(pivot);(一般情况下可以选几个值取中位数,也可以选第一位,或者随机位)

        重新排序数列,所有元素比基准值小的拜访在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任意边。)在这个分区退出后,改基准就处于数列的中间位置(也就是最终位置)这个操作我们称之为分区(partition);

        递归地把小于基准值元素地子数列和大于基准值元素地子数列排序(左右两边都使用快排);

i 是放下一个比基准值小的位置,j放比基准值大的值;先移动 j 再移动 i ;

先找比基准值小的,再找比基准值大的,交替找直到  i  j 相遇,基准值的位置就确定了;

因为基准值已经保存就可以移动 j 把第一个值覆盖掉(以第一个值为基准)

时间复杂度:

        最好情况:(每次分区都分成大小相等的两份)

        最坏情况:每次基准值都位于最左边或者最右边;

        平均情况(假设每次分成三比一的情况):

空间复杂度:

快速排序的改进策略(基准值的选取(随机选,选择多个元素的中位数);分区操作的优化;选择多个基准值);

八、堆排序

        二叉堆(大顶堆(根节点的键大于左右子树所有结点的键,并且左右子树都是大顶堆);小顶堆(根节点的键小于左右子树所有结点的键,并且左右子树都是小顶堆))

        

把数组看作一个完全二叉树;

堆排算法:

把完全二叉树构建成大顶堆,找到第一个非叶子结点,从后往前构建大顶堆

把堆顶元素和无序区的最后一个元素交换,交换之后无序区的长度减一,

把无序区重新调整成大顶堆,重复上一步操作,直到无序区的长度为1;

归并(缺点:占用内存空间复杂度O(n)),快排,堆排

九、基于比较的排序算法

        证明:基于比较 的排序算法,时间复杂度的下限就是O(nlogn);

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

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

相关文章

UE5 新特性 Nanite 开启

啥也不说&#xff0c;只能说&#xff0c;真的牛&#xff0c;在自己的项目上&#xff0c;从10几20的帧数&#xff0c;直接彪到了70 适用场景&#xff1a; 大场景&#xff0c;三角面足够多 在Project Setting里面 将这几个勾未true 勾上这个&#xff0c;放入场景即可

【电子通识】USB Logo的标识含义

USB 图标的设计灵感是来自罗马神话中的海神尼普顿(Neptune)&#xff08;也是海王星的名字&#xff09;的武器「三叉戟」&#xff0c;一支强有力的三齿鱼叉。不过&#xff0c;为了避免鱼叉形状的设计暗示人们拿着自己的USB 存储设备到处乱插&#xff08;叉&#xff09;。设计师对…

机器学习模型,超级全面总结!

机器学习是一种通过让计算机自动从数据中学习规律和模式&#xff0c;从而完成特定任务的方法。按照模型类型&#xff0c;机器学习可以分为两大类&#xff1a;监督学习模型和无监督学习模型。 附注&#xff1a;除了以上两大类模型&#xff0c;还有半监督学习和强化学习等其他类…

Texlive安装

下载4.8G的iso文件 解压 或 装载后&#xff0c;以管理员身份运行(.bat)文件。 运行以下两句代码进行Texlive相关升级 tlmgr option repository otan tlmgr update --self --all 运行以下三行代码&#xff0c;检查是否安装成功 latex -v xelatex -v pdflatex -v 如果有异常…

基于单片机的智能扫地机设计

概要 本文主要设计一个简单的智能扫地机。该扫地机的核心控制元器件是stc89c52&#xff0c;具有编写程序简单&#xff0c;成本普遍较低&#xff0c;功能较多&#xff0c;效率特别高等优点&#xff0c;因此在市场上得到很大的应用。除此之外&#xff0c;该扫地机能够自动避开障碍…

【Java 进阶篇】JSP EL 详解

在 Java Web 开发中&#xff0c;JavaServer Pages&#xff08;JSP&#xff09;是一种强大的技术&#xff0c;用于创建动态 Web 应用程序。JSP 的一个关键方面是 Expression Language&#xff08;EL&#xff09;表达语言&#xff0c;它允许您在 JSP 页面中嵌入 Java 代码&#x…

关于卷积神经网络的多通道

多通道输入 当输入的数据包含多个通道时&#xff0c;我们需要构造一个与输入通道数相同通道数的卷积核&#xff0c;从而能够和输入数据做卷积运算。 假设输入的形状为n∗n&#xff0c;通道数为ci​&#xff0c;卷积核的形状为f∗f&#xff0c;此时&#xff0c;每一个输入通道都…

记CVE-2022-39227-Python-JWT漏洞

文章目录 前言影响版本漏洞分析Newstar2023 Week5总结 前言 在Asal1n师傅的随口一说之下&#xff0c;说newstar week5出了一道祥云杯一样的CVE&#xff0c;于是自己也是跑去看了一下&#xff0c;确实是自己不知道的一个CVE漏洞&#xff0c;于是就从这道题学习到了python-jwt库…

机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python 计算机竞赛

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#x…

在MacBook上实现免费的PDF文件编辑

之前我想对PDF文件进行简单处理&#xff08;比如删页面、添空白页、调整页面顺序&#xff09;&#xff0c;要么是开wps会员【花钱贵】&#xff0c;下载&#xff08;盗版&#xff09;Adobe Acrobat【macOS不好下载】&#xff0c;要么用福昕阅览器登陆学生账号&#xff08;学校买…

[React] React-Redux 快速入门

文章目录 1.安装 Redux Toolkit 和 React Redux2.创建 Redux Store3.为 React 提供 Redux Store​4.创建 Redux State Slice5.添加 Slice Reducers 到 Store6.在 React 组件中使用 Redux State 和 Actions​7.总结 1.安装 Redux Toolkit 和 React Redux npm install reduxjs/t…

KaiOS APN配置文件apn.json调试验证方法(无需项目全编)

1、KaiOS 的应用就类似web应用&#xff0c;结合文件夹路径webapp字面意思理解。 2、KaiOS APN配置文件源代码在apn.json&#xff0c; &#xff08;1&#xff09;apn.json可以自定义路径&#xff0c;通过配置脚本实现拷贝APN在编译时动态选择路径在机器中生效。 &#xff08;…

集合框架:List系列集合:特点、方法、遍历方式、ArrayList,LinkList的底层原理

目录 List集合 特有方法 遍历方式 1. 使用普通 for 循环&#xff1a; 2. 使用增强型 for 循环&#xff08;foreach&#xff09;&#xff1a; 3. 使用迭代器&#xff08;Iterator&#xff09;&#xff1a; 4. 使用 Java 8 的流&#xff08;Stream&#xff09;API&#xff…

Softing新版HART多路复用器现支持图尔克excom和西门子ET 200iSP等远程I/O

Softing工业自动化最近升级了用于访问配置和诊断数据的smartLink SW-HT软件&#xff0c;现在该软件可支持访问图尔克excom和西门子ET 200iSP等远程I/O。 &#xff08;smartLink SW-HT支持访问配置和诊断数据&#xff09; 越来越多的新型远程I/O选择使用以太网来替代PROFIBUS连接…

系列十一、拦截器(二)#案例演示

一、案例演示 说明&#xff1a;如下案例通过springboot的方式演示拦截器是如何使用的&#xff0c;以获取Controller中的请求参数为切入点进行演示 1.1、前置准备工作 1.1.1、pom <dependencies><!-- spring-boot --><dependency><groupId>org.spring…

分享一下怎么做小程序营销活动

小程序营销活动已经成为现代营销的必备利器&#xff0c;它能够帮助企业提高品牌知名度、促进产品销售&#xff0c;以及加强与用户的互动。然而&#xff0c;要想成功地策划和执行一个小程序营销活动&#xff0c;需要精心设计和全面规划。本文将为您介绍小程序营销活动的策划和执…

OpenSign 开源 PDF 电子签名解决方案

OpenSign 是一个开源文档电子签名解决方案&#xff0c;旨在为 DocuSign、PandaDoc、SignNow、Adobe Sign、Smartwaiver、SignRequest、HelloSign 和 Zoho Sign 等商业平台提供安全、可靠且免费的替代方案。 特性&#xff1a; 安全签名&#xff1a;利用最先进的加密算法来确保…

easyHttp -- 轻量级的 HTTP 客户端工具包

easyHttp gitte地址:easy-http 介绍 easyHttp 是一个轻量级的 HTTP 客户端工具包&#xff0c;专为 Java 设计&#xff0c;使得基本的 HTTP 请求变得异常简单。该库主要针对常见的 HTTP 请求提供了简洁的 API&#xff0c;使得开发者无需面对复杂的设置。当前版本已支持基本的请…

私有化部署大模型:5个.Net开源项目

从零构建.Net前后端分离项目 今天一起盘点下&#xff0c;10月份推荐的5个.Net开源项目&#xff08;点击标题查看详情&#xff09;。 1、BootstrapBlazor企业级组件库&#xff1a;前端开发的革新之路 BootstrapBlazor是一个用于构建现代Web应用程序的开源框架&#xff0c;它基…

Jmeter分布式压测 —— 易踩坑点

1、压测机 无论是从成本角度还是维护的难易方面&#xff0c;压测机的数量&#xff0c;适量就好。举个例子&#xff0c;8C16G的一台服务器&#xff0c;部署Jmeter后&#xff0c;根据我个人的测试比对数据&#xff0c;配置≤1500个线程数&#xff0c;最好。太多了性能损耗较大&a…