归并排序算法

归并排序算法也算大家常用的一种方法,萌新周周在这里用C语言给大家简单总结一下归并排序算法吧。

关键:分治。

原理步骤:1.确定分界点,找下标的中间值 2.递归排序right和left 3.归并合二为一,其中第三个步骤是关键。

先把左边右边排完序,然后归并。

废话不多说,直接放代码吧,重要细节都有注释

#include <iostream>

using namespace std;

const int N=1000010;   

int n;
int q[N],tmp[N];//tmp数组存放左边和右边递归后的数 
void merge_sort(int q[],int l,int r)
{
	if(l>=r)return;//区间里的个数为1或0时返回 
	int mid=l+r>>1;//mid=(left+right)>>1相当于mid=(left+right)/2 
	
	merge_sort(q,l,mid),merge_sort(q,mid+1,r);//分别递归左边和右边 ,左边和右边都排完序了 
	
	int k=0,i=l,j=mid+1;//k代表和并的个数,取i,j两个指针变量,分别指向左边和右边的第一个数 
	while(i<=mid&&j<=r)
		if(q[i]<=q[j]) tmp[k++]=q[i++];//如果左边数小于右边数,则就把左边的数拿进归并后的数组里面,左边指针往后移一位,右边指针不动 
		else tmp[k++]=q[j++];//以上同理 
		while(i<=mid)tmp[k++]=q[i++];//如果右边数的指针已经指到最后一位,左边还未指完,直接把左边里的数拿进归并数组里 
		while(j<=r)tmp[k++]=q[j++];//右边情况同理; 
	for(i=l,j=0;i<=r;i++,j++)q[i]=tmp[j];//最后把临时数组里的数拿进q数组里面 
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&q[i]);
	merge_sort(q,0,n-1);
	for(int i=0;i<n;i++)printf("%d ",q[i]);
	return 0; 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值