c语言排序(1)

news2024/12/28 4:45:28

前言

排序在数据结构中占有非常重要的地位,我们在前面二叉树的数组实现时也用到了堆排序,下面我们就系统地讲一下排序。

1. 排序及其运用

1.1 什么是排序

所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

1.2 排序的运用 

购物软件筛选排序

院校排名

1.3 常见排序算法

2. 实现常见的排序算法

这里使用一个简单的无序数组实现各种排序

int arr[] = {9,5,3,4,6,1,2,8,7};

2.1 插入排序

思想:将待排序的记录按照关键值的大小逐个插入到一个已排好序的有序序列中,直到所有的记录都插入完为止,得到一个新的有序序列。

我们玩的扑克牌就运用到了插入排序的思想。

2.1.1 直接插入排序

简单来说,就是将9和5进行排序,排序好了之后再来看3,将3插入到已经排好序的9,5排序中,3小于9,9的位置后移,3比5小,五的位置后移,最后将3插入最前面的位置。排好后就是359,再看4,以此类推,直到所有的数据都排好。

因为每次的新数据都与原数据进行比较,所以我们需要用tmp将新数据存储起来。在一开始设置一个end为i的下标表示已排好序的最后一个位置,然后tmp是排好序后面的第一个数据,即end+1。这里我们进行升序排序,如果tmp的值小于end的值,那就将tmp位置的值变为end位置的值,然后end--,依次类推,直到找到tmp的值大于end的值,然后就将end位置后面的空余位给tmp值,如果一直没有找到tmp大于end的位置,那么end就会变为-1,然后end+1为0,将第一个位置给tmp。

时间复杂度:分两种情况:

如果遇到降序存储的数组,依次需要移动1,2,3,。。。。n-1次。然后得到就是时间复杂度为O(n^2)。

如果遇到升序的数组,时间复杂度就是O(1)。

空间复杂度:O(1)。

特点:元素集合越接近有序,时间效率越高。

2.1.2 希尔排序

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定⼀个整数(通常是gap =n/3+1),把待排序文件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进行排序,然后gap=gap/3+1得到下一个整数,再将数组分成各组,进行插入排序,当gap=1时,就相当于直接插入排序。

通俗来讲,就是将待排序集合按照一定的间距分为数组,例如间距为3,总共有9个数据,那么下标为0,3,6的数据就是一组,1,4,7的数据为一组,2,5,8的数据为一组。将各组数据进行类直接插入排序后,再将gap缩小,再进行排序操作,最后直到gap为1,则是直接插入排序。

希尔排序是在直接插入排序上面进行的优化,综合来说它的效率高于直接插入排序。

代码实现:

分析:因为最后一次是直接插入排序,为了避免造成最后一次gap直接为0的情况,我们将gap= gap/3+1。其余的代码就跟直接插入排序没什么区别,除了将end--和end+1分别变成了end-gap,end+gap。

时间复杂度:希尔排序的时间复杂度为O(n^1.3)。

空间复杂度:O(1)。

2.2 选择排序

选择排序思想:是通过每次选择出最大或最小的数据按要求放到数组尾部或头部。

2.2.1 直接选择排序

简单来说,就是遍历数组每次找到最大的数据,如果最大的数据是尾部,则不进行交换,如果不是,则进行交换。

代码实现:

我们这里对直接选择排序进行简单优化,在找最大数据的时候也找最小数据。将最前面的数据设置为假的最大和最小,然后遍历数组真的找最大最小。遍历完之后对max和end进行交换,对min和begin进行交换。然后将end--,begin++,让后面的遍历个数依次减少。

注意,如果是9,3,1这种情况,会发现我们的代码会有点缺陷。即交换完了之后还是9,3,1。所以我们通过再添加一个条件,如果最大值在begin,最小值在end,我们就将最大值的下标变为最小值的下标,这样运行时就先让end进行自交换,然后再交换begin和min,就实现了直接选择排序。

时间复杂度:while循环时间复杂度为O(n),内部为O(n)。所以为O(n^2)。

空间复杂度:O(1)。

2.2.2 堆排序

关于堆排序,已经在之前的博客里面讲解过,这里仅提供博客链接。

堆排序以及topk问题的解决 · 945d050 · 重邮阿江/c_study_experience - Gitee.com

2.3 交换排序

交换排序的基本思想:比较两个相邻的数据,将较大的数据向后移动,较小的数据向前移动。

2.3.1 冒泡排序

冒泡排序从头比较两个相邻的数据,数据较大的向后移动,每轮遍历排好一个最大的数据。

分析:一个for外循环表示遍历次数,一个for内循环表示遍历的下标数,在每次遍历的时候,如果遇到前者大于后者的情况,则进行交换,把较大的数移到后面。

优化:如果遇到已经是升序的情况,为了避免浪费资源,我们设置一个exchange为0,如果一次遍历完之后,没有进行交换的情况,那么这个数组说明是升序的,我们直接退出。

时间复杂度:O(n^2)。

空间复杂度:O(1)。

3. 源码

排序 · 79a3b38 · 重邮阿江/c_study_experience - Gitee.com

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

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

相关文章

合并两个列头不同的表格

有两个Excel的"named ranges",Events1和Events2。从第2行开始,它们都可以看做带表头的表格,并有部分表头相同。 Column1Column2Column3Column4DATEFIRST NAMESURNAMECODE1/2/2024JohnSmith31/2/2024LilyJJ33 Column1Column2Column…

【C++】类和对象——流插入和流提取运算符重载

目录 前言ostream和istream自定义类型的流插入重载自定义类型的流提取重载解决私有问题日期类总接口 前言 我们在上一节实现日期类时,在输入和输出打印时,经常会调用两个函数: void Insert()//输入函数{cin >> _year;cin >> _mo…

四款免费文案生成器app,你的文案创作神器

文案创作不仅需要创意和洞察力,还需要对语言的精准掌握。对于许多个人创作者和中小企业来说,聘请专业文案人员可能成本过高,而自己创作又可能面临灵感枯竭的困境。这时,免费的文案生成器App就显得尤为重要。免费文案生成器app的出…

Electron学习笔记(二)Hello World

目录 前言 运行主进程 创建界面 使用窗口打开界面 管理窗口的生命周期 关闭所有窗口时退出应用 (Windows & Linux)​ 如果没有窗口打开则打开一个窗口 (macOS) 使用预加载脚本访问渲染器的Node.js 添加你自己的功能 完整代码展示 效果展示 前言 接上一篇文章 …

JWT详细解析

目录 1. 什么是JWT? 2. 前后端完全分离认证问题 3. JWT的原理 4. JWT的数据结构 5. Header 6. Payload 7. Signature 8.JWT的使用方式 1. 什么是JWT? Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放…

nginx服务---负载均衡、平滑升级

一、nginx服务配置属性监控、nginx代理服务和nginx的IP访客黑名单 1.属性监控 通过在编译时加入 nginx 的 ngx_http_stub_status_module 模块可以实时监控以下基本的指标: 部署过程: 在配置文件/usr/local/nginx/conf/nginx.conf中的server模块中&…

【uniapp离线打包】(基于Android studio)

文章目录 uniapp打包官方教程入口一、准备工作(工具三大件)二、准备工作(Android壳和uniapp包)导入Android壳生成uniapp包将uniapp包导入android壳 三、准备工作(证书、)准备Android平台离线签名证书 四、修改配置参数build.gradl…

Data Augmentation数据增强

目录 数据增强是什么 为什么数据增强 数组增强分类 有监督数据增强 无监督数据增强 数据增强是什么 数据增强又称数据扩增,是一种通过应用合理且随机的变换(例如图像位移、旋转)来增加训练集多样性的技术。让有限的数据产生等价于更多数…

卷积神经网络(五)---图像增强的方法

前面的部分专注于卷积神经网络的层结构介绍,同时还介绍了到目前为止比较出名的卷积神经网络,接着使用比较复杂的卷积神经网络提高了 MNIST 数据集的准确率。下面将从另外的角度——图像增强的方面入手,提高模型的准确率和泛化能力。 一直以来…

C# 弃元的详解与示例

文章目录 1. 什么是弃元?2. 弃元的语法3. 弃元的应用场景4. 示例代码5. 总结 在C# 7.0及更高版本中,弃元(Discard)是一个新的语言特性,允许开发者在特定情况下忽略某些值。这在处理元组、解构操作或其他只需要部分值的…

【区块链+绿色低碳】泸州:“绿芽积分”号召全民绿色减碳 | FISCO BCOS应用案例

2021 年 6 月 5 日, 首个基于“绿普惠云”所构建的政府级碳普惠平台“泸州市‘绿芽积分’”在生态环境部 2021 年 六五世界环境日国家主场活动中展示,并跻身进入生态环境部“提升公民生态文明意识行动计划”2021 十佳公众 参与案例。 “绿普惠云”是为政…

精通推荐算法11:基于异构图游走的Graph Embedding

DeepWalk、Line和Node2vec对图结构数据进行随机游走,成功将其转化为一个序列问题,并利用Word2vec训练得到节点的Embedding向量。但它们都基于同构图,其节点均属于同一种类型。但现实世界的数据网络大多基于异构图,其节点类型以及节…

【Linux】全志Tina配置log串口信息以及env信息的方法

一、文件位置 V:\f1c100s\Evenurs\f1c100s\tina\device\config\chips\c200s\configs\F1C200s\linux\env-3.10.cfg 二、文件内容 三、介绍 console:串口信息 version:版本信息 appAB:ab区信息 cma:cma容量 四、总结 在此文…

【HarmonyOS】鸿蒙中如何获取资源文件的指定类型 fd,string,Uint8Array,RawFileDescriptor

【HarmonyOS】鸿蒙中如何获取资源文件的指定类型 fd,string,Uint8Array,RawFileDescriptor 一、问题背景: 众所周知,在鸿蒙中的资源分为media和rawfile。两者的区别对标android工程一致,后者是其他类型文…

高月供,高负债,有没有好的办法去解决?

朋友们,有没有过这样的经历,觉得手里那堆贷款账户和每个月高高的月供,就像两座大山压得你喘不过气?特别是想从网贷的高利贷坑跳到银行的低息怀抱,却屡遭拒绝,那种无力感和自我怀疑,简直让人崩溃…

【城市数据集】世界城市数据库和访问门户工具WUDAPT

世界城市数据库和访问门户工具WUDAPT WUDAPTLCZ分类具体步骤参考 在 城市气候研究中,用于描述城市特征的数据集一般采用基于类别的传统方法,将城市地区分为数量有限的类型,从而导致精确度下降。越来越多的新数据集以亚米微尺分辨率描述城市的…

嵌入式学习Day17---Linux软件变编程

目录 ​编辑 一、Linux 系统 1.1.Linux服务器 1.2.Linux嵌入式 1.3.Linux系统上的软件开发 1.操作系统 2.Linux内核 3.man手册 1.4.shell命令 1.基本命令 2.文件查看命令 3.文件查找命令 4.压缩解压文件 5.其他命令 6.通配符 7.管道 8.重定向 1.5.虚拟机上网 1.NAT模式 …

JS学习(变量、数据类型、运算符以及流程控制语句)

目录 一、变量 二、数据类型 三、运算符 四、类型转换 (1)字符串类型转为数字 (2)其他类型转为boolean(这些全部都是自动转换) 五、流程控制 一、变量 (1)var:声…

2024西安铁一中集训DAY26 ---- 模拟赛(最短路 + 实数域二分 + 线段树 + 并查集(平面图欧拉定理))

文章目录 前言时间安排与成绩题解A. 江桥的蓝紫灯(最短路)B. 江桥的破坏行动(实数域二分)C. 江桥的最小值(线段树)D. 江桥的山谷(并查集,平面图欧拉定理) 前言 感觉是做…

Android NDK 编译 libcurl支持https

最后在使用NDK中使用libcurl,由于不同的安卓设备,版本不一样;使用so时,会导致报错dlopen时找不到某函数或出错。 最后直接使用libcurl.a后,目前在几款盒子上测试均能正常工作。 libcurl需要支持https得提前编译两个库…