数据结构-C语言-排序(4)
代码位置:
test-c-2024: 对C语言习题代码的练习 (gitee.com)
一、前言:
1.1-排序定义:
排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。(注:我们这里的排序采用的都为升序)
1.2-排序分类:
常见的排序算法:
-
插入排序
a. 直接插入排序
b. 希尔排序 - 选择排序
a. 选择排序
b. 堆排序 - 交换排序
a. 冒泡排序
b. 快速排序 - 归并排序
a. 归并排序 - 非比较排序
a.计数排序
b.基数排序
1.3-算法比较:
1.4-目的:
今天,我们这里要实现的是归并排序、计数排序。
二、归并排序-递归:
2.1-定义:
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
2.2-思路:
归并排序两个基本过程:
1、分:将原数组分割成两个平分子数组的过程。
2、治:将分割后的数组两两结合成一个有序的数组的过程。
归并排序两个基本操作:
- 将待排序的线性表不断地切分成若干个子表,直到每个子表只包含一个元素,这时,可以认为只包含一个元素的子表是有序表。
- 将子表两两合并,每合并一次,就会产生一个新的且更长的有序表,重复这一步骤,直到最后只剩下一个子表,这个子表就是排好序的线性表。
2.3-过程图:
2.4-代码实现:
void _MagerSort(int* a, int begin,int end,int*tem)
{if (begin >= end)return;int mid = (begin + end) / 2;//子区间递归_MagerSort(a, begin, mid, tem);_MagerSort(a, mid+1, end, tem);//归并int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;int i = begin;while(begin1<=end1&&begin2<=end2){if (a[begin1] >= a[begin2]){tem[i++] = a[begin2++];}else{tem[i++] = a[begin1++];}}while (begin1 <= end1){tem[i++] = a[begin1++];}while (begin2 <= end2){tem[i++] = a[begin2++];}memcpy(a + begin, tem + begin, sizeof(int) * (end - begin + 1));
}//递归实现
void MagerSort(int* a, int n) //归并排序---时间复杂度(O(N*logN))
{int* tem = (int*)malloc(sizeof(int) * n);if (tem == NULL){perror("malloc MagerSort");return;}_MagerSort(a, 0, n - 1, tem);free(tem);
}
2.5-效果图:
三、归并排序-非递归:
3.1-定义:
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
3.2-思路:
我们知道,递归实现的缺点就是会一直调用栈,而栈内存往往是很小的,如果调用次数过多就会出现栈溢出的现象。所以,我们尝试着用循环的办法去实现归并排序。
我们可以通过间距值gap=1来实现将数组分割若干个只含一个数的子数组的操作,然后通过改变gap的值来实现两两合并的操作。
注意:在循环过程中我们需要考虑是否有越界的问题,如果有的话我们可以通过改变begin和end的值的方式来调整范围,修正路线。
拷贝时我们有两种拷贝方式:一种是全部拷贝(梭哈),另一种是部分拷贝。
3.3-过程图:
3.4-代码实现:
//非递归实现
//全部拷贝(梭哈)
void MergeSortNonR1(int* a, int n) //归并排序---时间复杂度(O(N*logN))
{int* tem = (int*)malloc(sizeof(int) * n);if (tem == NULL){perror("malloc fail\n");return;}int gap = 1;while (gap < n){for (int i = 0; i < n; i+=2*gap){int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;//修正路线if (end1 >= n){end1 = n-1;begin2 = n;end2 = n-1;}else if (begin2 >= n){begin2 = n;end2 = n-1;}else if (end2 >= n){end2 = n-1;}//归并int j = i;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] >= a[begin2]){tem[j++] = a[begin2++];}else{tem[j++] = a[begin1++];}}while (begin1 <= end1){tem[j++] = a[begin1++];}while (begin2 <= end2){tem[j++] = a[begin2++];} }memcpy(a, tem, sizeof(int) * n);gap *= 2;}free(tem);
}//部份拷贝
void MergeSortNonR2(int* a, int n) //归并排序---时间复杂度(O(N*logN))
{int* tem = (int*)malloc(sizeof(int) * n);if (tem == NULL){perror("malloc fail\n");return;}int gap = 1;while (gap < n){for (int i = 0; i < n; i += 2 * gap){int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;//修正路线if (end1 >= n){break;}else if (begin2 >= n){break;}else if (end2 >= n){end2 = n - 1;}//归并int j = i;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] >= a[begin2]){tem[j++] = a[begin2++];}else{tem[j++] = a[begin1++];}}while (begin1 <= end1){tem[j++] = a[begin1++];}while (begin2 <= end2){tem[j++] = a[begin2++];}memcpy(a+i, tem+i, sizeof(int) * (end2 - i + 1));}gap *= 2;}free(tem);
}
3.5-效果图:
四、计数排序:
4.1-定义:
计数排序是一种非比较排序算法。 它通过计算每个唯一元素的出现次数对数组进行排序。 它对唯一元素的计数进行部分哈希处理,然后执行计算以找到最终排序数组中每个元素的索引。 它是一个相当快的算法,但不适合大型数据集。 它作为基数排序中的一个子程序使用。
4.2-思路:
1.开辟计数数组:如果数据为:(100,102,106,110,107)的话这里从0开始开辟的话就会开辟一个长度111个的数组其中有100个是浪费的,这样的话如果数据过大的话这个排序的效率就会非常的低。所以,这里我们数组长度的开辟采用最大值-最小值的方式,这样就避免了上述情况。
2.出计数数组:出数组时我们是从计数数组的第一个下标中统计的个数依次往后出,出数组时我们需要下标加上最小值min,这样就实现排序啦!
4.3-过程图:
4.4-代码实现:
// 时间复杂度:O(N+range)
// 空间复杂度:O(range)
void CountSort(int* a, int n) // 计数排序
{int max = a[0];int min = a[0];for (int i = 1; i < n; i++){if (a[i] > max){max = a[i];}if (a[i] < min){min = a[i];}}int range = max - min+1;int* tem = (int*)malloc(sizeof(int) * range);if (tem == NULL){perror("malloc");return;}//开辟的数组初始化为0for (int i = 0; i < range; i++){tem[i] = 0;}for (int i = 0; i < n; i++){int j = a[i] - min;tem[j]++;}int m = 0;for (int i = 0; i < range; i++){while(tem[i]>0){if (tem[i] != 0){a[m++] = i + min;tem[i]--;}}}
}
4.5-效果图:
五、结语:
上述内容,即是我个人对数据结构排序中归并排序、计数排序的个人见解以及自我实现。若有大佬发现哪里有问题可以私信或评论指教一下我这个小萌新。非常感谢各位uu们的点赞,关注,收藏,我会更加努力的学习编程语言,还望各位多多关照,让我们一起进步吧!
相关文章:

数据结构-C语言-排序(4)
代码位置: test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言: 1.1-排序定义: 排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。(注:我们这里的排序采用的都为升序) 1.2-排…...

灰色关联分析【系统分析+综合评价】
系统分析: 判断哪个因素影响最大 基本思想:根据序列曲线几何形状的相似程度来判断其练习是否紧密 绘制统计图并进行分析 确定子序列和母序列 对变量进行预处理(去量纲、缩小变量范围) 熟练使用excel与其公式和固定(…...

linux 部署flask项目
linux python环境安装: https://blog.csdn.net/weixin_41934979/article/details/140528410 1.创建虚拟环境 python3.12 -m venv .venv 2.激活环境 . .venv/bin/activate 3.安装依赖包(pip3.12 install -r requirements.txt) pip3.12 install -r requirements.txt 4.测试启…...

ES6 数值的扩展(十八)
1. 二进制和八进制字面量 特性:可以直接在代码中使用二进制(0b 或 0B)和八进制(0o 或 0O)字面量。 用法:简化二进制和八进制数值的表示。 const binaryNumber 0b1010; // 二进制表示 10 const octalNumb…...

面试知识储备-redis和redission
1.redis的使用 引入依赖,自动注解redistemplate即可使用, 默认的redistemplate存入到redis中是字符流的形式,需要配置redistemplate, 如果不想配置,可以使用stringRedistemplate 可以使用string类型,但是…...

【5本可选】保证知网检索,现在投稿可在8月见刊,对文科领域友好
AEPH出版社旗下有5本学术期刊,专门出版自然科学、社会科学研究与教育领域论文的高影响力期刊,拥有正规ISSN号,出版类型涉及应用和理论方面的原创和未曾公开发表的研究论文,分配独立DOI号。 期刊1 Philosophy and Social Science…...

SpringBoot入门:如何新建SpringBoot项目(保姆级教程)
在本文中,我们将演示如何新建一个基本的 Spring Boot 项目。写这篇文章的时候我还是很惊讶的,因为我发现有些java的初学者,甚至工作10年的老员工居然并不会新建一个SpringBoot项目,所以特别出了一篇文章来教大家新建一个SpringBoo…...

数据恢复篇:适用于 Android 视频恢复的 6 个工具
在智能手机这个动态的世界里,每一刻都被捕捉并以数字方式存储,丢失珍贵的视频可能是一种令人心碎的经历。不必担心,因为 Android 生态系统提供了大量旨在挽救这些珍贵回忆的视频恢复应用程序。 这些应用程序是强大的工具,旨在挽救…...

Android笔试面试题AI答之控件Views(6)
答案来着文心一言,仅供参考 目录 1.简述什么是RemoteViews?使用场景有哪些?RemoteViews的特性使用场景总结 2.获取View宽高的几种方法?1. 在onWindowFocusChanged方法中获取2. 使用ViewTreeObserver.OnGlobalLayoutListener3. 使用ViewTreeObserver.OnPreDrawLi…...

扭蛋机潮玩小程序搭建,扭蛋机行业的创新
在当下潮玩市场中,扭蛋机具有盲盒的未知性和惊喜体验感,商品丰富,并且价格相对低廉,获得了极高的人气。年轻人开始对扭蛋机逐渐“上头”,为了扭到喜欢的商品不断地进行复购下单,在这场随机性的扭蛋游戏中&a…...

supOS赋能千行百业
推进制造业数字化转型是促进数字经济和实体经济深度融合的重点领域。在长期摸索和实践过程中,蓝卓打造了工厂操作系统、行业云操作系统、产业大脑操作系统三大产品,形成了企业侧、行业侧、产业侧的立体化赋能体系,全面赋能工业企业࿰…...

Vue中filter的使用
在 Vue.js 中,filter() 方法用于创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。filter() 不会改变原数组,而是返回一个新的数组。 语法 array.filter(callback(element[, index[, array]])[, thisArg])callback:…...

案例研究|柯尼卡美能达软件开发(大连)有限公司基于DataEase构筑内部数据可视化体系
柯尼卡美能达软件开发(大连)有限公司于2007年5月25日注册成立。公司以“洞悉在工作的人们真实情况,探寻他们的愿望,持续提供使人们更加幸福的服务”为使命,致力于系统品质测试服务、软件开发服务、IT安全服务、高级BPO…...

PHP框架详解- symfony框架
文心一言 Symfony框架是一个用PHP语言编写的开放源代码的Web应用框架,旨在加速Web应用程序的开发过程,提高代码的可维护性和可扩展性。以下是对Symfony框架的详细解析: 一、框架概述 起源与开发者: Symfony由SensioLabs&#…...

springboot系列十一:Thymeleaf
文章目录 官方文档基本介绍Thymeleaf机制说明Thymeleaf语法表达式运算符th属性迭代条件运算使用Thymeleaf th属性需要注意点 Thymeleaf综合案例需求说明思路分析代码实现 作业布置 官方文档 在线文档: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 离线…...

51单片机嵌入式开发:12、STC89C52RC 红外解码数码管显示
STC89C52RC 红外解码数码管显示 1 概述2 HX1838原理2.1 原理概述2.2 原理概述 3 HX1838代码实现3.1 工程整理3.2 工程代码3.3 演示 4 HX1838总结 1 概述 HX1838是一种常见的红外接收模块,用于接收和解码红外遥控器发送的红外信号。 HX1838具有以下特点和功能&#…...

数据结构--二叉树详解
一,概念 1,结点的度:一个结点含有子树的个数称为该结点的度 2, 树的度:一棵树中,所有结点度的最大值称为树的度; 3,叶子结点或终端结点:度为0的结点称为叶结点&#x…...

最短路径 | 743. 网络延迟时间之 Dijkstra 算法和 Floyd 算法
目录 1 基于 Dijkstra 算法1.1 代码说明1.2 完整代码 2 基于 Floyd 算法2.1 代码说明2.2 完整代码 前言:我在做「399. 除法求值」时,看到了基于 Floyd 算法的解决方案,突然想起来自己还没有做过最短路径相关的题。因此找来了「743. 网络…...

LLM模型与实践之基于 MindSpore 实现 BERT 对话情绪识别
安装环境 # 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行!pip install mindnlp0.3.1 !pip install mindnlp 模型简介 BERT是一种由Google于2018年发布的新型语言模型,它是基于Transforme…...

单例模式学习cpp
现在我们要求定义一个表示总统的类型。presented可以从该类型继承出French present和American present的等类型。这些派生类型都只能产生一个实例 为了设计一个表示总统的类型,并从该类型派生出只能产生一个实例的具体总统(如法国总统和美国总统&#x…...

第5讲:Sysmac Studio中的硬件拓扑
Sysmac Studio软件概述 一、创建项目 在打开的软件中选择新建工程 然后在工程属性中输入工程名称,作者,类型选择“标准工程”即可。 在选择设备处,类型选择“控制器”。 在版本处,可以在NJ控制器的硬件右侧标签处找到这样一个版本号。 我们今天用到的是1.40,所以在软…...

使用GoAccess进行Web日志可视化
运行网站的挑战之一是了解您的 Web 服务器正在做什么。虽然各种监控应用程序可以在您的服务器以高负载或页面响应缓慢运行时提醒您,但要完全了解正在发生的事情,唯一的方法是查看 Web 日志。阅读日志数据页面并了解正在发生的事情可能需要花费大量时间。…...

GD 32 流水灯
前言: 通过后面的学习掌握了一些逻辑架构的知识,通过复习的方式将学到的裸机任务架构的知识运用起来,同时巩固前面学到的知识,GPIO的配置等。 开发板上LED引脚使用示意图 注:此次LED灯的点亮凡是是高电平点亮ÿ…...

数据结构之栈详解
1. 栈的概念以及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈…...

算法:BFS解决 FloodFill 算法
目录 FloodFill 算法 题目一:图像渲染 题目二:岛屿数量 题目三:岛屿的最大面积 题目四:被围绕的区域 FloodFill 算法 在递归搜索回溯中已经说到过 FloodFill 算法了,但是那里是用 dfs 解决的,这里会使…...

Python 中文双引号 “”
Python 中文双引号 “” 1. SyntaxError: invalid character in identifier2. CorrectionReferences 1. SyntaxError: invalid character in identifier print(Albert Einstein once said, “A person who never made a mistake never tried anything new.”) print(Albert Ei…...

以太网(Ethernet)
目录 1. What is Internet?1.1. What is Ethernet?2. TCP/IP3. Physical Layer(PHY)4. Data Link Layer4.1. MAC Sublayer5. Network Layer5.1. IP5.2. ARP6. Transport Layer6.1. UDP6.2. TCP7. Application LayerFPGA实现以太网(一)——以太网简介 网络与路由交换 菜鸟FP…...

Scrcpy adb server version (41) doesn‘t match this client (39); killing...
通过Snap 在Ubuntu上安装 scrcpy之后,启动会导致无法同时 scrcpy和adb logcat 过滤日志 目前最新的安装的platforms-tools下面的adb 版本最新都是 adb 41版本 解决办法: 在这里链接里面 下载 adb 1.0.39 版本,替换 /home/host/Android/Sdk/…...

微服务实战系列之玩转Docker(四)
前言 幸福,就是继续追寻已经拥有的东西。 ——圣奥古斯丁 什么算已经拥有的?比如爱你的人在等你,比如每日热腾腾的三餐,比如身边可爱的同事,又比如此刻的你,看见了这篇博文(😁&#…...

微信小程序-自定义组件生命周期
一.created 组件实例创建完毕调用。定义在lifetimes对象里。 不能在方法里面更改data对象里面的值,但是可以定义属性值。 lifetimes:{//不能给data设置值created(){this.testaaconsole.log("created") }}二. attached 模板解析完成挂载到页面。 可以更…...