数据结构之归并排序及排序总结

目录

归并排序

归并排序的时间复杂度

 排序的稳定性

排序总结


归并排序

归并排序大家只需要掌握其递归方法即可,非递归方法由于在某些特殊场景下边界难控制,我们一般很少使用非递归实现归并排序。那么归并排序的递归方法我们究竟是怎样实现呢?

大家先想象一下这样一种场景,如果现在有两个数,我们要将这两个数排成升序,怎样呢?很简单,我们只需要将两个数进行一次大小的比较即可,比较完之后,小的元素放在前面,大的元素放在后面,其实这就是很简单的一次归并排序,两个素比较之后交换使得两个元素变得有序的场景我们就称作一次归并。

        我们再次深入分析,如果有两个元素,这两个元素可以直接比较,且比较之后两个数就变得有序,以此类推,如果们要对4个元素进行归并排序,按照此逻辑,将两两分成一组,然后这两组进行一次比较,比较完成之后,这4个元素应该就变有序了,但是事实真是这样吗?通过示意图为大家讲解:

 为什么两个元素互相比较就可以变得有序呢?

 这是因为当一个数组中只有一个数时,我们就可以称这个数组是有序的,当数组中有两个元素时,我们可以将这两个数每一个数都看成一个数组,此时这两个数组都是有序的,两个有序的数组,元素之间依次比较,肯定会将最终的整个数组变得有序,所以,我们要使四个数组变得有序,可以将数组分成左右两个数组,当我们使左右两个数组有序时,再将左右两个数组的元素依次进行比较,这样,最终四个数组成的数组就会有序。以此,归并排序的递归思路就出来了:

通过四个元素的数组为大家图示讲解归并排序的思想: 

归并排序的思想:我们要对一个数组进行归并排序,使它变得有序,我们就得先将这个数组分成左右两部分,相对左边这部分数组进行归并排序,然后再对右边这部分数组进行归并排序,左右两边的数组排好序之后,对左右两个数组的元素进行一次比较,我们也成对左右两个数组的元素进行归并,然后整个数组的归并排序就完成了。

归并排序的整体代码:

void _MergeSort(int* a, int left, int right, int* tmp)
{if (left >= right)return;int mid = (right + left) / 2;_MergeSort(a, left, mid, tmp);_MergeSort(a, mid + 1, right, tmp);int begin1 = left, begin2 = mid + 1;int end1 = mid, end2 = right;int i = left;//左右数组有序之后,就需要左右数组进行归并while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}//左右两个数组,当一个数组归并完时,一个数组可能还没有归并完,将没有归并完的这个数组的元素依次赋值给中间数组while (begin1 <= end1){tmp[i++] = a[begin1++];}while (begin1 <= end1){tmp[i++] = a[begin2++];}for (int j = 0; j < right + 1; j++){a[j] = tmp[j];}
}
void MergeSort(int* a, int size)
{int* tmp = (int*)malloc(sizeof(int) * size);if (tmp == NULL){printf("malloc fail");exit(-1);}_MergeSort(a, 0, size - 1, tmp);free(tmp);tmp = NULL;
}
int main()
{int arr[] = {99,88,66,77,55,44,33,22,11 };MergeSort(arr,sizeof(arr)/sizeof(int));for (int i = 0; i < sizeof(arr) / sizeof(int); i++){printf("%d ", arr[i]);}return 0;
}

运行截图:

        

归并排序的时间复杂度

时间复杂度:O(N*logN)     

稳定性:稳定

 排序的稳定性

什么是排序的稳定性呢?

其实就是,在未排序之前,数组中有两个相同的元素(有顺序),如果在排序之后这两个元素的顺序没有发生变化,则称这个排序是稳定的,如果排序之后顺序发生了变化,我们就称这个排序算法是不稳定的。

排序总结

          直接插入排序:最好的情况下就是一个有序数组,插入的元素只用跟前面数组的最后一个元素比较,最好复杂度为O(N)。最坏的情况就是一个逆序数组,每个要插入的元素都要和前面的数组元素比较一下,就是等差数列求和O(N^2)
          希尔排序:时间复杂度不好计算,大概是O(N^1.3)
          选择排序:没有最好和最坏,编译器不知道所以,每个元素都和最小的元素比较一次,一趟排序确定了一元素的位置,剩下的元素下一趟继续进行比较,时间复杂度为等差数列求和O(N^2)
          堆排序:没有最好和最坏,因为都是从一个大堆或者小堆进行调整,为O(N*logN)
          冒泡排序:有序时,我们有优化,一趟比较下来没有发生交换,所以终止后面的排序,但是第一趟的相邻两个元素都发生了比较,比较了N次,所以最好时间复杂度为O(N),最坏,逆序,等差数列求和O(N^2)
         快速排序:最好:每次找到的key都在中间,所以刚好是一个满二叉树,高度为logN,每层比较N次,总共比较N*logN次,所以最好为O(N*logN)
                           最坏:一个有序数组,每次找的key都在最左边,总共N层,比较等差数列求和次,所以最坏为O(N^2)
         归并排序:最好最坏都是O(N*logN)

         只有快速排序和归并排序他们俩才会消耗额外额空间,因为递归要频繁的消耗栈帧,且快排非递归实现时运用了栈的数据结构。

好了,到此常见的排序算法我们已经全部学写完成了,排序算法是面试中的重点,大家一定要掌握。

好了,本期的内容到此结束^_^

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

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

相关文章

算法--最小生成树和二分图

这里写目录标题 Xmind最小生成树Prim算法思想例子题解 kruskal算法思想例子题解 二分图染色法思想 二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 Xmind 最小生成树 Prim算法 思想 对于dist数组&am…

Spring boot -- 学习HttpMessageConverter

文章目录 1. Json格式数据获取2. 为什么返回Json格式的数据2.1 注解SpringBootAppliaction2.1.1 SpringBootConfiguration2.1.2 ComponentScan2.1.3 EnableAutoConfiguration2.1.3.1 HttpMessageConvertersAutoConfiguration2.1.3.2 WebMvcAutoConfiguration 2.2 注解RestContr…

独立完成软件的功能的测试(2)

独立完成软件的功能的测试&#xff08;2&#xff09; &#xff08;12.13&#xff09; 1. 对穷举场景设计测试点&#xff08;等价类划分法&#xff09; 等价类划分法的概念&#xff1a; 说明&#xff1a;数据有共同特征&#xff0c;成功失败分类&#xff1a; 有效&#xff1a…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(二)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理1&#xff09;数据介绍2&#xff09;数据测试3&#xff09;数据处理 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客&#xff0c;在读者…

Python和Beautiful Soup爬虫助力提取文本内容

大家好&#xff0c;网络爬虫是一项非常抢手的技能&#xff0c;收集、分析和清洗数据是数据科学项目中最重要的部分。今天介绍如何从链接中爬取高质量文本内容&#xff0c;我们使用迭代&#xff0c;从大约700个链接中进行网络爬取。如果想直接跳转到代码部分&#xff0c;可以在下…

【JUC】二十六、Java对象内存布局和对象头

文章目录 0、前置1、对象的内存布局2、对象头之对象标记Mark Word3、对象头之类元信息4、实例数据5、对齐填充6、对象内存布局之JOL证明7、对象分代年龄8、压缩指针 0、前置 heap&#xff08;堆区&#xff09;&#xff0c;分为新生区new、养老区old、元空间Metaspace&#xff…

C语言—每日选择题—Day46

第一题 1. 下列程序段的输出结果是&#xff08;&#xff09; #include <stdio.h> int main() {int x 1,a 0,b 0;switch(x) {case 0: b;case 1: a;case 2: a;b;}printf("a%d,b%d\n", a, b);return 0; } A&#xff1a;a2,b1 B&#xff1a;a1,b1 C&#xf…

探秘机器学习核心逻辑:梯度下降的迭代过程 (图文详解)

一 需求解函数 f() 和 g()函数分别为求y值和求导数的函数。 目的&#xff1a;求该函数的最小值&#xff1a; 代码&#xff1a; import numpy as np import matplotlib.pyplot as plt f lambda x : (x - 3.5) ** 2 - 4.5 * x 10 g lambda x : 2 * (x - 3.5) - 4.5x np.l…

接口管理——Swagger

Swagger是一个用于设计、构建和文档化API的工具集。它包括一系列工具&#xff0c;如Swagger Editor&#xff08;用于编辑Swagger规范&#xff09;、Swagger UI&#xff08;用于可视化API文档&#xff09;和Swagger Codegen&#xff08;用于根据API定义生成客户端库、server stu…

SpringCloud系列(二)| Nacos的安装与配置

Nacos是阿里巴巴提供的一个开源的可作为注册中心和配置中心的SpringCloud组件。 Nacos/nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称;一个更易于构 建云原生应用的动态服务发现、配置管理和服务管理平台。 简单来说Nacos有两个核心功能&#xff0c…

深度学习中的各类评价指标

深度学习中的各类评价指标 1 Dice Loss2 Precision&#xff08;精度&#xff09;3 Recall&#xff08;召回率&#xff09;4 F-Score5 mAP 1 Dice Loss Dice Loss&#xff0c;也叫Soft Dice Coefficient&#xff0c;是一种用于图像分割任务的损失函数。它基于目标分割图像与模型…

Uniapp项目打包到多个平台...

打包到微信小程序 先设置微信开发者工具的路径 运行到小程序模拟器&#xff0c;会自动打开微信开发者工具&#xff08;需要先在微信开发者工具->设置->安全设置->服务端口切换为打开状态&#xff09; 3. 微信开发者工具上传版本&#xff08;提示覆盖版本就可以了&a…

“百里挑一”AI原生应用亮相,百度智能云千帆AI加速器首个Demo Day来了!

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

用户管理第2节课 -- idea 2023.2 创建表

一、懂得 1.1编码格式是防止乱码的&#xff0c;utf-8是完全够的&#xff0c;那几个基本没差别 网址&#xff1a; 【IDEA——连接MySQL数据库&#xff0c;创建库和表】_idea中数据库-CSDN博客 这些是MySQL数据库中的一些术语&#xff0c;可以简单解释如下&#xff1a; 1、col…

第三十四周:文献阅读+LSTM学习

目录 摘要 Abstract 文献阅读&#xff1a;综合EMD-LSTM模型在城市排水管网水质预测中的应用 现有问题 提出方法 EMD-LSTM综合模型 研究框架 结论 Long Short-term Memory(长短期记忆) 1. LSTM的结构 2. Multiple-layer LSTM 3.3 LSTM Example 3. GRU LSTM实现PM2…

Java+SSM+MySQL基于微信的在线协同办公小程序(附源码 调试 文档)

基于微信的在线协同办公小程序 一、引言二、系统设计三、技术架构四、管理员功能设计五、员工功能设计六、系统实现七、界面展示八、源码获取 一、引言 随着科技的飞速发展&#xff0c;移动互联网已经深入到我们生活的各个角落。在这个信息时代&#xff0c;微信作为全球最大的…

靠谱的车- 华为OD统一考试(C卷)

靠谱的车- 华为OD统一考试&#xff08;C卷&#xff09; OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xf…

【知识】如何区分图论中的点分割和边分割

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 以下两个概念在现有中文博客下非常容易混淆&#xff1a; edge-cut(边切割) vertex-partition(点分割)vertex-cut(点切割) edge-partition(边分割) 实际上&#xff0c;初看中文时&#xff0c;真的会搞不清楚。但…

黑豹程序员-EasyExcel实现导出

需求 将业务数据导出到excel中&#xff0c;老牌的可以选择POI&#xff0c;也有个新的选择EasyExcel。 有个小坑&#xff0c;客户要求样式比较美观&#xff0c;数字列要求千位符&#xff0c;保留2位小数。 可以用代码实现但非常繁琐&#xff0c;用模板就特别方便&#xff0c;模…

Pyhon基于YOLOV实现的车辆品牌及型号检测项目源码+模型+项目文档

项目运行运行录屏&#xff1a; Pyhon基于YOLOV实现的车辆品牌及型号检测项目运行录屏 完整代码下载地址&#xff1a;Pyhon基于YOLOV实现的车辆品牌及型号检测项目 项目背景&#xff1a; 车辆检测及型号识别广泛应用于物业&#xff0c;交通等的管理场景中。通过在停车场出入口…