常见排序算法之归并排序——归并排序

2023-11-15

         

哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的归并排序,博主在这里先分享归并排序的递归算法,包您一看就会,快来试试吧~


目录

 一、归并排序

1.1 基本思想

1.2 算法思想

1.3 程序设计思想

1.4 程序实现

1.5 归并排序的特性总结:


 一、归并排序

1.1 基本思想

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法 (Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序 列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。


1.2 算法思想

到这里,我们可以得到一条结论,两个有序的子序列可以合成一个新的有序子序列,通过递归,我们两个新的有序序列也可以组成新的有序数列,最终实现排序的目的。有些朋友就会问了,这个我懂,关键是咋实现有序数列,其实非常的简单,分割递归至每个子序列只有一个元素时,是不是就有序啦,然后就可以合成有两个元素有序的列表嘛,再合成4个,8个……


1.3 程序设计思想

定义一个tmp数组,可以是动态开辟的(malloc),用于临时存放合并后的有序数据,定义_MergeSort()函数,用于分解,合并数据(递归实现),参数有,待处理数组,数据区间(数组下标),tmp数组。

  1. 判断区间是否存在,区间不存在以及只有一个元素的情况结束程序。
  2. 分割区间:mid=(left+right)/2;递归左右区间,分割递归至每个子序列只有一个元素。
  3. 每两个子序列一组,循环遍历每一个元素,if比较两个子序列各元素的大小,取大或取小,放入tmp数组,tmp[index++]=子序列++;直到有一个子序列遍历完,循环结束。
  4. 循环判断是子序列是否遍历完毕,未遍历完毕的子序列剩余元素直接给到tmp数组。
  5. 将tmp数组的对应的元素拷贝回原数组(已有序)。

1.4 程序实现

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>//动态开辟空间的函数的头文件

void _MergeSort(int *a,int left,int right,int *tmp)
{
	//区间不存在以及只有一个元素的情况结束程序
	if (left>=right)
	{
		return;
	}

	int mid = (left + right) / 2;
	//假设[left,mid],[mid+1,right]有序,那么我们就可以归并了
	//递归使左右区间有序
	//分割递归至每个子序列只有一个元素
	_MergeSort(a,left,mid,tmp);
	_MergeSort(a, mid+1,right, tmp);

	//归并
	int begin1 = left, end1 = mid;
	int begin2 = mid + 1, end2 = right;
	int index = left;

	while (begin1<=end1&&begin2<=end2)//有一个子序列遍历完,循环结束
	{
		if (a[begin1] < a[begin2])//升序,取小
		{
			tmp[index++] = a[begin1++];

		}
		else
		{
			tmp[index++] = a[begin2++];
		}
	}

	//判断子序列是否遍历完,未遍历完毕的子序列剩余元素直接给到tmp数组
	while (begin1 <= end1)
	{
		tmp[index++] = a[begin1++];
	}

	while (begin2<=end2)
	{
		tmp[index++] = a[begin2++];
	}

	//拷贝回去
	for (int i=left;i<=right;++i)
	{
		a[i] = tmp[i];
	}
}

//归并排序
void MergeSort(int *a,int n)
{
	int* tmp=(int*)malloc(sizeof(int)*n);//动态开辟与待排序数组大小相等的一片连续的空间
	_MergeSort(a,0,n-1,tmp);//子函数实现归并

	free(tmp);//释放动态开辟的空间
}

//打印
void Print(int* a, int n)
{
	for (int i=0;i<n;++i)
	{
		printf("%d ",a[i]);
	}
}
int main()
{
	int a[] = {10,6,7,1,3,9,4,2};
	MergeSort(a,sizeof(a)/sizeof(a[0]));
	Print(a,sizeof(a)/sizeof(a[0]));
	return 0;
}


1.5 归并排序的特性总结:

1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问 题。

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

3. 空间复杂度:O(N)

4. 稳定性:稳定


至此归并排序的递归算法博主已经分享完了,相信大家对这个归并排序的逻辑有了一定的理解,大家可以自己动手敲敲代码,感受一下。

 本期收录于博主的专栏——排序算法,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“常见排序”。排序算法_保护小周ღ的博客-CSDN博客

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ ——归并排序非递归算法

 文章存在借鉴,如有侵权请联系修改删除!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常见排序算法之归并排序——归并排序 的相关文章

随机推荐

  • pytest-mock的使用

    mock介绍 当一个功能依赖另一个功能时 而这个功能还没有完善 需要使用mock来模拟依赖的返回 mock主要有以下几个库 unittest mock python内置的用于mock的库 有Mock MagicMock path等类可以使用
  • python热更新_reload 实现热更新

    什么是 reload 当我们在 python 的交互模式下测试某个类的时候 发现这个类的某个方法有错误进行了修改 而这个方法的输入又依赖于之前在交互模式下的好几个操作 这时要怎么办呢 如果重启交互模式 那么该方法依赖的操作就得重新再来一次
  • IIS搭建本地电脑服务器:通过内网穿透技术实现公网访问的步骤指南

    1 前言 在网上各种教程和介绍中 搭建网页都会借助各种软件的帮助 比如网页运行的Apache和Nginx 数据库软件MySQL和MSSQL之类 为方便用户使用 还出现了XAMPP PHPStudy 宝塔面板等等一系列集成服务 都是为了方便我
  • 接口测试常用工具(转)

    原文地址 https my oschina net hellotest blog 662347 Poster 这是火狐浏览器的一个插件 如果你想调试服务器 发出HTTP请求 Poster操作简单 你先设定一个内容类型 数分钟内 你将拥有需要
  • 如果后端API一次返回10万条数据,前端应该如何处理?

    英文 https medium com frontend canteen if the backend api returns 100 000 records at one time how should we handle it in t
  • JavaScript操作cookie实现记住用户名密码功能(一)

    JavaScript操作cookie实现记住用户名密码功能 一 之前说的删除cookie哪里找到解决办法了 就是直接调用setCookie cname cvalue 1 传值的时候时间传入 1 就是前一天就可以了 由来简述 最近一段时间在使
  • python-全排列

    python 全排列 permutations itertools permutations iterable r None 返回由 iterable序列中的元素生成的长度为r的排列 r默认设置为 iterable 的长度 如果有相同的元素
  • 什么是SSC(扩频时钟)?

    SSC全称Spread Spectrum Clocking 即扩频时钟 由于信号的辐射主要是由于信号的能量过于集中在其载波频率位置 导致信号的能量在某一频点位置处的产生过大的辐射发射 因此为了进一步有效的降低EMI辐射 芯片厂家在设计芯片时
  • spark学习8:spark SQL

    1 spark SQL是什么 spark SQL类似 hive 的功能 hive 是把SQL转译成 查询hadoop的语法 而spark SQL是把 SQL转译成 查询spark的语法 并且 spark SQL的前身 shark 也叫hiv
  • ESP8266_01与Arduino连接串口乱码问题(参考多个论坛和http://wenku.baidu.com/view/6cb6a96bb7360b4c2e3f64b2.html解决)

    Arduino uno的默认波特率为9600 ESP8266 01的波特率默认为115200 通过串口输出时会出现乱码 Arduino测试程序 由于uno串口只有连个 所以测试的时候选择2 3作为软串口使用 include
  • AIX下打tar包及压缩

    AIX下打tar包及压缩为gz格式 1 打tar包 tar cvf XXX XX tar XXX XX ls 下发现多了XXX XX tar文件 2 压缩为gz格式 gzip XXX XX tar ls 发现XXX XX tar变成了XXX
  • android 点击查看大图

    转载自 https www cnblogs com yoyohong p 7264946 html 仅供参考 1 使用方式 Intent intent new Intent FriendCircleActivity this ImageGr
  • Linux中的各种符号,*,$,-,--?

    点 隐藏文件 一个点 指向当前目录 两个点 指向当前目录的上级目录 相对路径的写法 说明是一个变量 PATH linux环境变量 通配符 当前用户的家目录 每个用户的家目录是不同的 root用户的家目录在系统根目录下 其他用户的家目录在 h
  • Power bi 4.6 聚类图

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 数据集链接见微信公共号底端 1 在Power BI中导入可视化效果 点击 选择导入自定义视觉对象 点击导入 2 选择我们需要导入的视觉对象 3 在可视化就会出现新的图形 4 导入 D
  • A Tour of Computer Systems

    1 1 Information is Bits Context All information in a system is represented as a bunch of bits The only thing that distin
  • 图片从base64编码转换为jpg文件

    1 使用网站 注意在base64编码前加上 data image png base64 http tool chinaz com tools imgtobase 2 转换的代码 package com test import java io
  • 牛逼!Windows竟然也能运行QEMU虚拟机!

    这些天研究 Miracast 又倒腾了开发用的虚拟机 但是发现了新的东西就是 QEMU 全宇宙最强的硬件模拟器 原来这玩意可以在Windows上跑虚拟机的 环境部署 msys2 mingw w64 qemu 系统iso Hyper V 代替
  • linux排序文件命令,Linux文件排序工具 sort 命令详解

    本文目录 1 1 选项说明 1 2 sort示例 1 3 深入研究sort sort是排序工具 它完美贯彻了Unix哲学 只做一件事 并做到完美 它的排序功能极强 极完整 只要文件中的数据足够规则 它几乎可以排出所有想要的排序结果 是一个非
  • (七) carla真实世界坐标系与全局俯视地图像素坐标系变换

    七 carla真实世界坐标系与全局俯视地图像素坐标系变换 问题陈述 下图为 c a r l a carla carla 中 T
  • 常见排序算法之归并排序——归并排序

    哈喽大家好 我是保护小周 本期为大家带来的是常见排序算法中的归并排序 博主在这里先分享归并排序的递归算法 包您一看就会 快来试试吧 目录 一 归并排序 1 1 基本思想 1 2 算法思想 1 3 程序设计思想 1 4 程序实现 1 5 归并