练车加端盘子也挡不住我学习系列——归并排序算法

本文深入讲解归并排序算法,一种基于分治法的高效排序算法,由约翰·冯·诺伊曼于1945年首次提出。文章通过对比选择排序,详细阐述归并排序的原理、步骤及代码实现,适合初学者理解掌握。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是归并排序?

归并排序,是创建在归并操作上的一种有效的排序算法,效率为O(nlogn)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列,归并排序的比较次数小于快速排序的比较次数,移动次数一般多于快速排序的移动次数。你懂了吗?哈哈哈(手动滑稽~)
在这里插入图片描述

经典案例

我给你一个无序的数组,让你给我排序成从小到大的数组!你怎么排?
选择排序法?

for(int i=0;i<n-1;i++)
    	for(int j=i+1;j<n;j++)
    	{
    		if(a[i]>a[j])
    		{
    			int t;
    			t=a[i];
    			a[i]=a[j];
    			a[j]=t;
    		}
    	}

在这里插入图片描述

时间复杂度为O(n^2),咱说,多少有点low啊,哈哈哈哈嗝。

归并排序算法

在这里插入图片描述

从早上10点练完车开始思考这个问题,中午端盘子,下午练车也在思考,现在才勉强能理解,但理解的还很不到位。这个算法对新手真的是不太友好。需要慢慢去捂,怎么实现的呢,看下面这个图!
在这里插入图片描述
归并排序原来就是将一堆数字分开,再合成有序的数列。
其实,这就是分治的思想,将大问题化小问题,将每个最小的问题处理好,合并起来大问题也就处理OK了。

代码实现

#define Max 100
    void merge(int A[],int L1,int R1,int L2,int R2)//合并序列
    {
    	int i=L1,j=L2;
    	int temp[Max],counts=0;
    	while(i<=R1&&j<=R2)
    	{
    		if(A[i]<=A[j]) temp[counts++]=A[i++];
    		else temp[counts++]=A[j++];
    	}
    	while(i<=R1) temp[counts++]=A[i++];
    	while(j<=R2) temp[counts++]=A[j++];
    	for(int i=0;i<counts;i++)
    		A[L1+i]=temp[i];
    }
    void mergeSort(int A[],int left,int right)
    {
    	int mid;
    	if(left<right)
    	{
    		mid=(left+right)/2;
    		mergeSort(A,left,mid);//递归,对左边序列进行拆分
    		mergeSort(A,mid+1,right);//递归,对右边序列进行拆分
    		merge(A,left,mid,mid+1,right)//合并序列
    	}
    }

不懂就慢慢悟吧,俺也一样。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无所畏惧的man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值