冒泡,选择,插入,希尔排序

目录

一. 冒泡排序

1. 算法思想

2. 时间复杂度与空间复杂度

3. 代码实现

二. 选择排序

1. 算法思想

2. 时间复杂度与空间复杂度

3. 代码实现

三.插入排序

1. 直接插入排序

(1). 算法思想

(2). 时间复杂度与空间复杂度

(3). 代码实现

2. 希尔排序

(1). 算法思想

(2). 代码实现

(3). 时间复杂度与空间复杂度

一. 冒泡排序

1. 算法思想

假设排升序,从头开始两两比较选出最大的的值移到最后面(假设下标为10),再从头开始两两比较选出次大的移到下标为9的地方以此类推

2. 时间复杂度与空间复杂度

(1). 最优情况

当数据全都有序时,最快。因为此时每个元素只需比较一次就可以完成整个排序过程此时时间复杂度为   O(N)

(2). 最坏情况

当数据逆序时最慢,此时每一次比较都需要交换。时间复杂度为  O(N²)

(3). 平均情况

综上所述,平均复杂度为  O(N²)

(4). 空间复杂度

冒泡排序只需要一个额外变量来交换元素,不需要额外的数据结构来存储数据,所以空间复杂度为     O(1)

3. 代码实现
void BubbleSort(int* a, int n)//冒泡排序
{int count = 0;for(int j=0;j<n-1;j++){for (int i = 0; i < n - j-1; i++){if (a[i] <a[i+1] ){Swap(&a[i], &a[i + 1]);count = 1;}}if (count == 0)break;}
}

二. 选择排序

1. 算法思想

假设排升序,遍历数组,选出最大值与排序数列的最后一个元素(假设下标为10)交换,再从除最后一个元素(即下标0~9)的序列中找出次大值与下标为9的序列交换以此往复知道排序完毕

2. 时间复杂度与空间复杂度

(1). 时间复杂度

选择排序需要遍历n-1次来找到最小(或最大)元素,并且在每次遍历中都需要对剩余未排序元素进行遍历以找到最小(或最大)元素,因此选择排序的时间复杂度总是   O(N²)

(2) 空间复杂度

只需一个额外变量来存储找到的最大(或最小)元素的索引,所以空间复杂度为   O(1)

3. 代码实现

我们实现一个优化版本,同时找到最大的值与最小的值,分别与头和尾交换

void SelectSort(int* a, int n)
{int begin = 0, end = n -1;while(begin<end){int max = begin, min = begin;for (int i = begin+1; i <= end; i++){if (a[i] > a[max])max = i;if (a[i] < a[min])min = i;}Swap(&a[begin], &a[max]);Swap(&a[end], &a[min]);begin++;end--;}
}

以上代码还有一个小问题,当出现下图情况时

begin所指向的值与max所指向的值交换,那min指向的值就变为了原来max所指向的值,此时再与end交换会发生将最大的值交换过去的情况

修改代码为

void SelectSort(int* a, int n)
{int begin = 0, end = n -1;while(begin<end){int max = begin, min = begin;for (int i = begin+1; i <= end; i++){if (a[i] > a[max])max = i;if (a[i] < a[min])min = i;}if (begin == min){Swap(&a[begin], &a[max]);Swap(&a[max], &a[end]);}else{Swap(&a[begin], &a[max]);Swap(&a[end], &a[min]);}begin++;end--;}
}

三.插入排序

1. 直接插入排序
(1). 算法思想

从第一个元素开始排序,先排前一个数,再排前两个数以此类推

假设排升序,第一个数自然是有序的,第二个数与第一个数比较,如果比第一个数小就与其交换,然后看第三个数,此时前两个数是有序的,第三个数先于第二个数比较,比第二个数小就与其交换,再与第一个数比较,比第一个数小就与其交换,如果不比第二个数小就看第四个数,此时前三个数都是有序的以此类推

(2). 时间复杂度与空间复杂度

① 最好情况

在有序情况下只需遍历一遍即可时间复杂度为   O(N)

②最坏情况

在逆序情况下,每一次比较都要交换,时间复杂度为 O(N²)

③平均情况

综上所述平均时间复杂度为O(N²)

④空间复杂度

只需要一个额外的空间来存储当前要插入的元素,空间复杂度为O(1)

(3). 代码实现
void InsertSort(int* a,int n)//直接插入排序
{for(int i=0;i<n-1;i++){int end = i;int t = a[i+1];while (end >= 0){if (t < a[end]){a[end+1] = a[end];end--;}else   break;}a[end+1] = t;}}
2. 希尔排序
(1). 算法思想

是直接插入算法的改进版本,总体操作可大致分为两步

先进行预排序

直接插入排序

 直接插入排序是和距离为1的元素比较,而希尔排序是和距离为gap的元素比较,gap不断变小,直到变为1,此时即是直接插入排序

初始序列为 9 1 2 5 7 4 8 6 3 5 ,gap值为5进行一次预排序过程如下

预排序后序列为

当gap为2时

预排序后序列为

 我们发现预排序后一定比之前更加接近有序

从时间上讲,gap越大,大的数可以越快的到后面去,小的数可以越快的到前面去

gap越小呢,预排序完就越接近有序,gap==1就是直接插入排序

我们就可以将gap慢慢减少直到变为1从而进行直接插入排序是尽量是最好的情况

(2). 代码实现

希尔排序的代码与直接插入排序的代码十分相似,不同的地方就是gap,可以通过三层循环或四层循环实现,两者执行的次数实际是一样的

void ShellSort(int* a, int n)//希尔排序
{int gap = n;while(gap>1){gap =gap/ 3+1;// 除3不一定会=1,但3是最合理的,所以+1保证最后一次gap一定是1 //for(int j=0;j<gap;j++)//{for (int i = 0; i < n - gap; i++)//一组一组的排序所以i也可以+=gap,效率没有区别,都是要走这些步数{int end = i;int t = a[end + gap];while (end >= 0){if (t < a[end]){a[end + gap] = a[end];end -= gap;}elsebreak;}a[end + gap] = t;}//}}
}
(3). 时间复杂度与空间复杂度

希尔时间复杂度的计算,需要很高的数学水平,此处只做粗略解释(我不会,嘿嘿)

①时间复杂度

我们假设每一次gap=n/3,此时每组三个数据,

最坏情况下 第一次排序消耗:(1+2)*n/3==n

下一次 

gap=n/3/3=n/9,每组9个数据

但此时由于上面的预排序,不可能是最坏情况,即

(1+2+3+4+5+6+7+8)*n\9

具体计算我也不会

但是最后一次,gap==1时(此时很接近有序)

直接插入排序消耗n

时间复杂度大致为  O(N^1.3)即N的1.3次方

②空间复杂度

由于不需要额外的空间,所以空间复杂度为O(1)


这篇文章就到这里啦

(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤

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

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

相关文章

使用mitmproxy抓包详细记录(一)

1、安装mitmproxy pip install mitmproxy 安装失败解决方案&#xff0c;见上一篇 2、编辑代码&#xff0c;可以直接复制我的. 给文件起名&#xff0c;attacy.py import mitmproxyimport csv from mitmproxy import httpclass RequestRecorder:def __init__(self):self.records…

文件安全传输系统,如何保障信创环境下数据的安全传输?

文件安全传输系统是一套旨在保护数据在传输过程中的安全性和完整性的技术或解决方案。通常包括以下几个关键组件&#xff1a; 加密&#xff1a;使用强加密算法来确保文件在传输过程中不被未授权访问。 身份验证&#xff1a;确保只有授权用户才能访问或传输文件。 完整性校验…

如何通过SSH协议使用WinSCP实现Windows与Linux之间的远程公网文件传输

目录 ⛳️推荐 前言 1. Windows传输文件至Linux 2. WinSCP使用公网TCP地址连接 3. WinSCP使用固定公网TCP地址访问服务器 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 前…

使用geoipupdate自动更新GeoIP数据库

一、 什么是 GeoIP&#xff1f; 通过在数据库中将地理位置和 IP 地址相互映射&#xff0c;软件程序便可以使用 IP 地址来确定其对应的地理位置&#xff0c;其中包括国家/地区、州/省、城市、邮政编码、纬度/经度、ISP、区号和其他信息。 很多软件都使用 MaxMind 的数据库对 IP…

PyMongo Sort 操作:提升你的数据查询效率

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

AI写作辅助,如何确保学术诚信?

感谢笔灵AI&#xff0c;让我论文完成后但毕竟是AI生成的&#xff0c;充满了AI的痕迹。不敢轻率地将其呈交&#xff01;最终一个必须完成的任务就是清除AI的痕迹。今天就为大家带来笔灵去AI痕迹&#xff0c;好用到哭&#xff01;走起&#xff01; 传送门&#xff1a;https://ib…

新版本WPS不登录无法编辑的解决办法

原因分析&#xff1a;新版本的WPS因加入多种在线功能&#xff0c;建议登录账号获得更加体验 解决办法&#xff1a;首选第一种修改注册表后重启WPS&#xff0c;第二种仅作为临时满足工作需求&#xff0c;过一段时间会自动失效 方法一&#xff1a;键盘同时按下WINR键&#xff0c;…

【NLP大模型】词嵌入的空间表示与应用

文章目录 一、语义特征空间二、引入新维度&#xff1a;皇室三、语义特征向量的用途四、向量运算类比五、词嵌入的维度和应用词嵌入的应用 六、测量欧几里得距离向量计算向量和欧几里得距离 七、使用点积测量相似度八、创建词嵌入 一、语义特征空间 考虑“男人”、“女人”、“…

33页PPT免费下载 | 2024企业数据资产化及数据资产入表白皮书

一、前言 2024年01月&#xff0c;财政部《关于加强数据资产管理的指导意见》&#xff0c;通过加强和规范公共数据资产基础管理工作探索公共数据资产应用机制&#xff0c;促进公共数据资产高质量供给&#xff0c;有效释放公共数据价值&#xff0c;为赋能实体经济数字化转型升级…

Java用JDBC链接mysql

一、什么是JDBC&#xff1a; 是Java平台上的标准数据库访问技术。它提供了一套API&#xff08;应用程序编程接口&#xff09;&#xff0c;允许Java应用程序与各种类型的数据库进行交互&#xff0c;包括关系型数据库&#xff08;如MySQL、Oracle、SQL Server等&#xff09;和非关…

【日记】艾尔登法环终于玩完了(348 字)

正文 昨天打了一天游戏。法环差不多通关了。最终 boss 艾尔登鼻涕虫实在打不过&#xff0c;两个人开挂打了。艾尔登之兽老是马拉松&#xff0c;这谁顶得住&#xff0c;追都追不上。据兄长说&#xff0c;这游戏大概还有 50%-60% 的内容没玩&#xff0c;不过就这样吧&#xff0c;…

解决VMware虚拟机在桥接模式下无法上网的问题

解决VMware虚拟机在桥接模式下无法上网的问题 windows11系统自动启动了热点功能&#xff0c;开启热点可能会干扰虚拟机的桥接设置。 方法一&#xff1a;windows11可以提供网络热点服务 方法二&#xff1a;手动指定桥接的物理网卡 方法一&#xff1a;关闭热点功能 优点&#xff…

MYSQL 四、mysql进阶 10(数据库其它调优策略)

一、数据库调优的措施 1.1 调优的目标 尽可能节省系统资源 &#xff0c;以便系统可以提供更大负荷的服务。&#xff08;吞吐量更大&#xff09;合理的结构设计和参数调整&#xff0c;以提高用户操作响应的速度 。&#xff08;响应速度更快&#xff09;减少系统的瓶颈&#xff…

13 循环神经网络—序列模型,语言模型

目录 1.序列模型序列数据统计工具自回归模型马尔可夫模型因果关系前向算法举例(根据过去的事件推测未来的事件)方案 A -马尔科夫假设方案 B -潜变量模型总结代码实现 使用马尔科夫假设 训练一个MLP2.文本预处理常见的文本预处理步骤代码实现3.语言模型**使用计数来建模**N 元…

VUE前端HTML静默打印(不弹出打印对话框)PDF简单方案

前言 在做打印功能的时候&#xff0c;以前大部分客户端都是用C#做的&#xff0c;静默打印&#xff08;也就是不弹出打印对话框&#xff09;比较简单。 但是使用浏览器作为客户端&#xff0c;静默打印&#xff08;也就是不弹出打印对话框&#xff09;做起来就比较困难。困难的…

29.【C语言】自定义函数

1、自定义详解 *提示&#xff1a;先看第12,19篇 例&#xff1a;写一个程序交换两个变量的值 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void swap(int x, int y) {int z 0;z x;x y;y z; } int main() {int a 10;int b 20;swap(a, b);printf("%d…

让AI语言模型自由飞翔:LangChain框架的奇妙世界

今天&#xff0c;我将为大家揭开一项令人激动的技术——LangChain。想象一下&#xff0c;如果能将人工智能的强大能力与我们日常使用的数据和工具无缝连接&#xff0c;那将开启怎样崭新且无限的可能&#xff01; LangChain&#xff0c;一个专为大型语言模型设计的框架&#xf…

TG创建小程序交互APP登录以及机器人信息

1、搜索 BotFather &#xff0c;输入命令 /newbot 创建机器人。 2、修改机器人信息 /mybots 编辑名称 : 修改机器人名称 编辑关于: 修改关于 hayden yyds&#xff0c;修改以后打开机器人会出现在下图 编辑描述 : 机器人的描述 编辑描述图片 : 机器人的图片 编辑 Botpic…

瑞幸私域运营案例拆解

1. 私域运营概述 私域运营是一种以用户为中心的运营模式&#xff0c;通过建立和维护与用户之间的直接联系&#xff0c;实现品牌与用户之间的深度互动和长期价值挖掘。 1.1 私域流量定义 私域流量指的是企业通过自有渠道&#xff0c;如微信公众号、小程序、社群等&#xff0c…

【通信协议-RTCM】MSM语句(1) - 多信号GNSS观测数据消息格式

注释&#xff1a; RTCM响应消息1020为GLONASS星历信息&#xff0c;暂不介绍&#xff0c;前公司暂未研发RTCM消息类型版本的DR/RTK模块&#xff0c;DR/RTK模块仅NMEA消息类型使用 注释&#xff1a; 公司使用的多信号语句类型为MSM4&MSM7&#xff0c;也应该是运用最广泛的语句…