【数据结构】—超级详细的归并排序(含C语言实现)

这篇具有很好参考价值的文章主要介绍了【数据结构】—超级详细的归并排序(含C语言实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【数据结构】—超级详细的归并排序(含C语言实现),数据结构与算法炼体 淬体中,数据结构,排序算法,算法,c语言

                                       食用指南:本文在有C基础的情况下食用更佳 

                                       🔥这就不得不推荐此专栏了:C语言

                                       ♈️今日夜电波:斜陽—ヨルシカ

                                                                0:30━━━━━━️💟──────── 3:20
                                                                    🔄   ◀️   ⏸   ▶️    ☰ 

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


目录

♉️一、前置知识—什么是归并排序

 ♊️二、归并排序

        归并排序的思想

        归并排序的递归实现

       ♒️归并排序的非递归实现(难点)

♋️三、归并排序的特性总结


♉️一、前置知识—什么是归并排序

        归并排序是一种基于分治思想的排序算法。它将待排序的数组分成两个子数组,对每个子数组进行排序,最后将子数组合并成一个有序的数组。具体来说,归并排序采用递归的方式将数组不断二分,直到每个子数组只有一个元素,然后再将相邻的两个子数组归并成一个有序的数组,然后不断合并,直到最终得到原数组的有序排列,当然你也可以采用非递归的方法,总体的思路都是一样的。与快速排序不同的是,归并排序在每轮排序中都会将数组完全拆分成两个子数组。


 ♊️二、归并排序

        归并排序的思想

        归并排序是基于分治思想的一种排序算法,它可以将一个大问题分解成若干个小问题,再通过合并小问题的解来得到大问题的解。

        具体来说,归并排序的思想如下:

  1. 将待排序的数组划分为两个子数组,对每个子数组进行递归排序;
  2. 将排好序的子数组合并成一个有序的数组。

        这一过程可以不断重复,直到将整个数组划分为单个元素的子数组,然后再将其合并成一个有序数组,排序完成。

        一图理解~ 

【数据结构】—超级详细的归并排序(含C语言实现),数据结构与算法炼体 淬体中,数据结构,排序算法,算法,c语言

        动图了解~ 

【数据结构】—超级详细的归并排序(含C语言实现),数据结构与算法炼体 淬体中,数据结构,排序算法,算法,c语言 

        归并排序的递归实现

        归并排序的递归实现步骤如下:

  1. 如果数组长度为1,直接返回该数组;
  2. 将数组按中间位置划分成两个子数组,分别对这两个子数组进行递归排序,得到排好序的两个子数组;
  3. 将排好序的两个子数组合并成一个有序数组,具体方法为创建一个辅助数组,同时遍历两个子数组,比较两个子数组中当前位置的元素,将较小的元素放入辅助数组中;
  4. 将辅助数组中的元素复制回原数组中。

        代码实现:

void _Mergesort(int* a, int* temp,int begin, int end)
{
	if (end <= begin)//递归结束条件
		return;

	int mid = (begin + end) / 2;//开始二分
	_Mergesort(a, temp, begin, mid);//左半边
	_Mergesort(a, temp, mid + 1, end);//右半边

	
	//正式的归并操作

	//分出来的两个数组的下标
	int begin1 = begin;
	int end1 = mid;
	int begin2 = mid + 1;
	int end2 = end;
	int index = begin;

	while(begin1 <= end1 && begin2 <= end2)//归并
	{
		if (a[begin1] < a[begin2])
		{
			temp[index++] = a[begin1++];
		}
		else
		{
			temp[index++] = a[begin2++];
		}
	}
	//当其中有一个条件不符合时,跳出循环,但是可能还有数据每遍历完
	while (begin1 <= end1)
	{
		temp[index++] = a[begin1++];
	}

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

	// 拷贝回原数组
	memcpy(a + begin, temp + begin, (end - begin + 1) * sizeof(int));//拷贝对应的数据到对应的位置

}

void Mergesort(int* a, int n)
{
	int* temp = (int*)malloc(sizeof(int) * n);
	if (temp == NULL)
	{
		perror("malloc fail");
		return;
	}

	_Mergesort(a, temp,0,n-1);

	free(temp);
}

         ♒️归并排序的非递归实现(难点)

        归并排序的非递归实现,也称为迭代实现,采用的是自底向上的方式,

        步骤如下:

  1. 将原数组按照长度为1的子数组进行划分,每个子数组都是有序的;
  2. 将长度为1的有序子数组两两合并,得到长度为2的有序子数组;
  3. 重复以上步骤,直到得到一个完整有序的数组。

         代码实现:

void MergesortNonR(int* a, int n)
{
	int* temp = (int*)malloc(sizeof(int) * n);
	if (temp == NULL)
	{
		perror("malloc fail");
		return;
	}

	//设置一个gap用于从间距为1开始(也就是最开始的归并),对于数组进行归并操作,然后归并完一遍后让gap*2继续归并,以此类推
	int gap = 1;

	while (gap < n)//gap停止的条件,实际上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 (begin2 >= n)
			{
				break;
			}

			// 如果第二组的右边界越界,修正一下
			if (end2 >= n)
			{
				end2 = n - 1;
			}

			//以下的操作就是和递归的操作相同的归并操作
			int index = i;
			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] < a[begin2])
				{
					temp[index++] = a[begin1++];
				}
				else
				{
					temp[index++] = a[begin2++];
				}
			}

			while (begin1 <= end1)
			{
				temp[index++] = a[begin1++];
			}

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

			// 拷贝回原数组
			memcpy(a + i, temp + i, (end2 - i + 1) * sizeof(int));
		}

		gap *= 2;

	}
	free(temp);
}

♋️三、归并排序的特性总结

        1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的
        外排序问题。
        2. 时间复杂度:O(N*logN)
        3. 空间复杂度:O(N)
        4. 稳定性:稳定

                    感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       【数据结构】—超级详细的归并排序(含C语言实现),数据结构与算法炼体 淬体中,数据结构,排序算法,算法,c语言

                                                                         给个三连再走嘛~  文章来源地址https://www.toymoban.com/news/detail-716648.html

到了这里,关于【数据结构】—超级详细的归并排序(含C语言实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法与数据结构】归并排序的代码实现(详细图解)以及master公式的讲解

    目录 1、归并排序  1.1、算法描述  1.2、图解说明 2、代码实现  3、master公式 3.1、公式以及结论 3.2、适用于某些特殊的递归 3.3、计算归并排序的时间复杂度 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用 递归 或者说是 分治法 (Divide and Conquer)的一个非

    2024年02月08日
    浏览(62)
  • 探索数据结构世界之排序篇章(超级详细,你想看的都有)

    - 文章开头必看 1.!!!本文排序默认都是排 升序 2.排序是否稳定值指指排完序之后相同数的相对位置是否改变 3.代码相关解释我都写在注释中了,方便对照着看 插入排序是一种高效的简单排序算法,它的工作原理是将一个未排序的元素插入到一个已排序的列表中,并保持列

    2024年02月08日
    浏览(46)
  • 【数据结构】C语言实现顺序表(超级详细)

    目录 概念及结构 接口函数实现 顺序表的初始化 容量判断  顺序表尾插  顺序表尾删 顺序表头插 顺序表头删 顺序表查找 顺序表指定位置插入 顺序表指定位置删除 打印顺序表 销毁顺序表 顺序表完整代码 顺序表作为线性表的一种,它是用一段 物理地址连续的存储单元依次

    2024年04月10日
    浏览(36)
  • 【数据结构与算法】归并排序详解:归并排序算法,归并排序非递归实现

    归并排序是一种经典的排序算法,它使用了分治法的思想。下面是归并排序的算法思想: 递归地将数组划分成较小的子数组,直到每个子数组的长度为1或者0。 将相邻的子数组合并,形成更大的已排序的数组,直到最终得到一个完全排序的数组。 归并排序的过程可以分为三

    2024年01月22日
    浏览(70)
  • 数据结构——排序算法——归并排序

    在第二个列表向第一个列表逐个插入的过程中,由于第二个列表已经有序,所以后续插入的元素一定不会在前面插入的元素之前。在逐个插入的过程中,每次插入时,只需要从上次插入的位置开始,继续向后寻找插入位置即可。这样一来,我们最多只需要将两个有序数组遍历

    2024年02月09日
    浏览(47)
  • 【数据结构】快速排序,归并排序

    1.hoare版本 根据动图的演示,整理的思路如下, 1.定义left,right,key。key默认是左边第一个元素,像两个指针,左边找比key大的,右边找比k小的,找到的话,交换二者,往返这个过程,当left与right相遇时,交换key和此时相遇的值. 单趟下来,6出现在正确的位置。 1.为什么大循环

    2024年01月20日
    浏览(42)
  • 【数据结构 C语言版】第四篇 栈、堆栈、Stack(超级详细版)

    写在前面 更新情况记录: 最近更新时间 更新次数 2022/10/18 1 参考博客与书籍以及链接: (非常感谢这些博主们的文章,将我的一些疑问得到解决。) 参考博客链接或书籍名称 《数据结构》陈越 代码随想录 总目录:目前数据结构文章太少,没有写。 正文 如果你c语言还有困

    2023年04月09日
    浏览(33)
  • 【数据结构】排序(3)—堆排序&归并排序

                                      目录      一. 堆排序       基本思想         代码实现    向上调整算法    向下调整算法       时间和空间复杂度       稳定性     二. 归并排序       基本思想       代码实现       时间和空间复杂度       稳定性      

    2024年02月08日
    浏览(40)
  • 【数据结构】——归并排序和计数排序

    🌇个人主页:_麦麦_ 📚今日名言:繁华落尽,我心中仍有花落的声音。一朵,一朵,在无人的山间轻轻飘落。——席慕蓉《桐花》 目录 一、前言 二、正文 1.归并排序 1.1 基本思想 1.2【递归版】具体实现  1.3【递归版】代码部分  1.4【非递归版】具体实现  1.5【非递归版】

    2023年04月15日
    浏览(48)
  • 【数据结构】排序之归并排序与计数排序

    个人主页 : zxctsclrjjjcph 文章封面来自:艺术家–贤海林 如有转载请先通知 在前面的文章中介绍了 插入排序和交换排序,今天来分享的是归并排序和计数排序。 话不多说,正文开始。 归并排序既是内排序也是外排序。 基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的

    2024年01月17日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包