23-数据结构-内部排序-归并排序

目录

归并排序

一、简介:

二、思路

三、代码


归并排序

一、简介:

        归并,也叫合并,合二为一嘛,归并排序实际上相当于二叉树递归,先左右拆分,最后给数组拆分为每个数据为独立个体,再执行合并操作。

时间复杂度:O(nlog_2{n})-----口令:快(快速排序)以nlog_2{n}归(归并排序)队(堆排序)

空间复杂度:O(n)因为需要临时数组几个数据,临时数组大小就是几个。口令--饿鬼(归并)炸鸡(基数排序)块

稳定性:稳定,因为归并的时候,优先归并前面那个范围的,相对位置不贵发生改变,

口令--稳稳的幸福,鸡(基数排序)毛(冒泡排序)插(直接插入和折半插入排序)龟(归并排序)壳

排序趟数:对N个元素进行K路归并,排序排序趟数t等于t=log_k{N}向上取整。

移动次数:N个元素,进行k路归并,移动元素个数为:N*log_k{N}

二、思路

归并排序主要分为两步:第一步,给数组左右拆分;第二步两两合并

第一步,给数组左右拆分:

  1. 给数组传进两个标记,表示数组范围,分别为low和high
  2. 当low<high时,计算mid中间标记,这样就给一个数组分为两个数组了mid为中间点
  3. 然后进入递归,左边递归数组范围时low和mid右边递归范围时mid+1和high。
  4. 就这样层层递归,递归到最后,每个数据都成叶子结点了,再执行归并操作,但一个元素时肯定有序,所以返回倒数第二层,执行归并操作,依次往上返。
  5. 步骤如图所示,但是,原理是图中从最下层开始递归,然后递归到最后,都递归成叶子结点了,返回倒数第二层开始第一次归并操作,开始两两合并,选大小。

第二步两两合并:

  1. 叶子结点时,归并操作没用,因为只有一个元素,肯定有序,因此往倒数第二层返回,执行倒数第二层的归并操作。
  2. 归并时,我们是传了三个坐标,low,mid和high。
  3. 先创建个临时数组,给原数组的数值复制进去,用来对比最大或最小值,
  4. 再定义一个实际坐标,指向实际数组中要存放的位置,
  5. 就这个要存放的位置,来个循环,每次循环的时候,进行low到mid这个范围和mid+1到high这个范围进行比对,然后二选一存放值。
  6. 如果最后两两没法对比了,再给剩下的都放进实际数组即可

三、代码

#include <stdio.h>
#include <malloc.h>
void PrintSort(int *a,int len)
{int i=0;for(i=0;i<len;i++){printf("%d ",a[i]);}printf("\n");
} 
void Merge(int *a,int low,int mid,int high)
{int *b=(int*)malloc((high+1)*sizeof(int));int i;for(i=low;i<=high;i++){b[i]=a[i];//临时数组,存进去值,用来取值比较。	}//k为a数组实际指向的箭头 int k=low;//用p,q两个箭头分别指向b数组中两个紧挨着的有序数组,然后判断谁打谁小,随后给a[k]重新赋值 int p,q;//两数组对比,然后选出一个,赋值到a中,随后k++,a数组换下一个坐标接着重复 步骤 for(p=low,q=mid+1,k=low;p<=mid&&q<=high;k++){//在临时数组b中进行对比选择,最后赋值到实际数组a中 if(b[p]<=b[q]) {a[k]=b[p];p++;}else{a[k]=b[q];q++;}}//如果对比完,还有一个数组没有对比完,接着往后赋值即可。 while(p<=mid){a[k]=b[p];k++;p++;	}	while(q<=high){a[k]=b[q];k++;q++;}
}
void MergeSort(int *a,int low,int high)
{//归并排序是个递归过程,先从整体表,慢慢拆分 //拆分成每个数据是个整体时,再执行归并操作//两个合并成一个,依次往回返回if(low<high){int mid =(low+high)/2;MergeSort(a,low,mid);MergeSort(a,mid+1,high);Merge(a,low,mid,high);}
} int main()
{int a[7]={49,38,65,97,76,13,27};MergeSort(a,0,6);PrintSort(a,7);return 0;
}

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

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

相关文章

苹果平板可以用别的电容笔吗?电容笔和Apple pencil区别

和苹果原装的Pencil相比&#xff0c;这种平替的电容笔并没具备重力压感&#xff0c;只有一种倾斜的压感功能。如果你不经常用来作画&#xff0c;一支普通的电容笔就足够了。不管是用来记笔记&#xff0c;还是用来解决一些数学问题&#xff0c;都能用得上。再说了&#xff0c;即…

微信小程序中封装请求,使用Async await方法,将异步请求变为同步请求方法

介绍 微信小程序中&#xff0c;很多 API都是异步的&#xff0c;无法同步处理。可以使用高级封装&#xff0c;通过async await方法来同步处理。 方法 在小程序右上角的 详情 里选择 本地设置 , 勾选 ES6转ES5&#xff0c;如下所示&#xff1a; 由于 Async Await 是 ES7语法&a…

【机器学习】逻辑回归

文章目录 逻辑回归定义损失函数正则化 sklearn里面的逻辑回归多项式逻辑回归 逻辑回归 逻辑回归&#xff0c;是一种名为“回归”的线性分类器&#xff0c;其本质是由线性回归变化而来的&#xff0c;一种广泛使用于分类问题中的广义回归算法。 线性回归是机器学习中最简单的的…

JavaScript爬虫程序实现自动化爬取tiktok数据教程

以下是一个使用 request-promise 和 JavaScript 的爬虫程序&#xff0c;用于爬取tiktok的内容。此程序使用了 https://www.duoip.cn/get_proxy 这段代码。 // 引入 request-promise 库 const rp require(request-promise);// 定义 get\_proxy 函数 function get_proxy() {retu…

计算机网络 | 传输层

计算机网络 | 传输层 计算机网络 | 传输层功能概述UDP协议TCP协议TCP协议的特点TCP报文段TCP连接管理TCP连接的建立TCP连接的释放 TCP可靠传输序号确认重传 TCP流量控制TCP拥塞控制慢开始和拥塞避免快重传和快恢复 第5章总结 参考视频&#xff1a;王道计算机考研 计算机网络 参…

CSS进阶

目标&#xff1a;掌握复合选择器作用和写法&#xff1b;使用background属性添加背景效果 01-复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09;。 后代选…

Adobe携手网易有道,助力高校师生释放创意潜能

当Adobe创意设计在线课程进入中国高等院校&#xff0c;会给高校师生带来怎样的变化&#xff1f; 为了助力中国高等院校师生充分释放创意潜能&#xff0c;10月18日&#xff0c;Adobe宣布携手网易有道&#xff0c;面向中国的高等院校推出Adobe创意设计在线课程。 【Adobe携手网易…

Python 异常

目录 1 导引问题2 异常机制本质2.1 python 中一切都是对象&#xff0c;异常也采用对象的方式来处理。处理过程&#xff1a; 3 解决异常问题的态度4 异常解决的关键&#xff1a;定位5 try...一个except 结构6 try...多个except 结构7 try...except...else 结构8 try...except...…

Linux下使用openssl为harbor制作证书

openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有&#xff1a;SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证…

uni-app:js二维数组与对象数组之间的转换

一、二维数组整理成对象数组 效果 [ ["前绿箭","DI10","RO1"], ["前红叉","DI2","RO2"], ["后绿箭","DI12","RO3"], ["后红叉","DI4","RO6"] ] …

Bootstrap的媒体对象组件(图文展示组件),挺有用的一个组件。

Bootstrap的.media类是用于创建媒体对象的&#xff0c;媒体对象通常用于展示图像&#xff08;图片&#xff09;和文本内容的组合&#xff0c;这种布局在展示新闻文章、博客帖子等方面非常常见。.media类使得创建这样的媒体对象非常简单&#xff0c;通常包含一个图像和相关的文本…

Redis实现附近商户

GEO数据结构的基本用法 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a; GEOADD&#xff1a;添加一个地理空间信息&#xf…

初阶数据结构-常见的排序算法

排序 排序的概念常见的排序算法常见排序算法的实现数组的打印 插入排序直接插入排序的实现希尔排序( 缩小增量排序 )希尔排序的实现 交换排序冒泡排序冒泡排序的实现选择排序选择排序的实现堆排序堆排序的实现快速排序快速排序非递归 归并排序归并排序的递归实现归并排序的非递…

数据分析:密度图

目前拥有的数据如图&#xff0c;三列分别对应瑕疵种类&#xff0c;对应的置信 度&#xff0c;x方向坐标。 现在想要做的事是观看瑕疵种类和置信度之间的关系。 要显示数据分布的集中程度&#xff0c;可以使用以下几种常见的图形来观察&#xff1a; 1、箱线图&#xff08;Box P…

跨境电商:产业带的深度赋能

近年来&#xff0c;中国跨境电商平台崭露头角&#xff0c;成为推动国内产业带转型升级和出海的新引擎。这一充满活力的领域不仅让中国制造走向世界&#xff0c;也为国内众多产业提供了数字化升级的机会&#xff0c;实现了“小单快反”和按需供应。 专业跨境电商平台如SHEIN和阿…

【网络】网络编程套接字(一)

网络编程套接字 一 一、网络编程中的一些基础知识1、认识端口号2、认识TCP协议和UDP协议3、网络字节序 二、socket编程1、sockaddr结构2、简单的UDP网络程序Ⅰ、服务器的创建Ⅱ、运行服务器Ⅲ、关于客户端的绑定问题Ⅳ、启动客户端Ⅴ、本地测试Ⅵ、网络测试 一、网络编程中的一…

【试题002】C语言有关于sizeof的使用

1.说明&#xff1a;sizeof()是测量数据类型所占用的内存字节数&#xff0c;字符串常量在存储时除了要存储有效字节外&#xff0c;还要存储一个字符串结束志‘\0’。 2.代码举栗子&#xff1a; #include <stdio.h> int main() {char str[] "book";printf(&qu…

Jupyter Notebook 设置黑色背景主题

Jupyter Notebook 设置黑色背景主题 # 包安装 pip install jupyterthemes -i https://mirrors.aliyun.com/pypi/simple pip install --upgrade jupyterthemes # 查看可用主题 jt -l # monokai暗背景&#xff0c;-f(字体) -fs(字体大小) -cellw(占屏比或宽度) -ofs(输出段的字…

黑马JVM总结(三十七)

&#xff08;1&#xff09;synchronized-轻量级锁-无竞争 &#xff08;2&#xff09;synchronized-轻量级锁-锁膨胀 重量级锁就是我们前面介绍过的Monitor enter &#xff08;3&#xff09;synchronized-重量级锁-自旋 &#xff08;4&#xff09;synchronized-偏向锁 轻量级锁…

中科芯与IAR共建生态合作,IAR集成开发环境全面支持CKS32系列MCU

中国上海–2023年10月18日–嵌入式开发软件和服务的全球领导者IAR今日宣布&#xff0c;与中科芯集成电路有限公司&#xff08;以下简称中科芯&#xff09;达成生态合作&#xff0c;IAR已全面支持CKS32系列MCU的应用开发。这一合作将进一步推动嵌入式系统的发展&#xff0c;并为…