归并排序算法

归并排序

原理:运用双指针来求解问题,时间复杂度nlog2(n)

原理步骤:

1.先找到数组的中间值mid=(l+r)>>2

2递归,把递归的各段排好顺序

3.归并,把所得到的归并到一起

例如:(归并思想)1 3 5 7 9这个指针先指向1
2 4 5 8 10 这个指针先指向2

指定一个temp[]数组,1小于2,1加入temp,第一段指针指向3,第二段不变指针指向2,2小于3,2加入temp,第一段不变,第二段指向4,4比3大,3加入temp,第一段指针移到5,4小于5,4加入temp,第二段移到5,5和5,默认把上面那个5加入temp,以此类推最后如果两个还剩下数的话直接加进去就好了。

代码

#include<stdio.h>
#include<iostream> 
using namespace std;
const int N=1e6+10;
int q[N],n,tmp[N];
void guibing_sork(int q[],int l,int r)
{
	if(l>=r)return ;//如果只有一个的话就直接返回
	int mid=l+r>>1;//第一步找一个中间值
	int k=0,j=mid+1,i=l;
	guibing_sork(q,l,mid),guibing_sork(q,mid+1,r);//递归先排好各段的序列
	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++];//把剩下的第一段加入临时数组tmp
	while(j<=r)tmp[k++]=q[j++];//把剩下的第一段加入临时数组tmp
	for(i=l,j=0;i<=r;i++,j++)q[i]=tmp[j];//原来的重新加q数组中
	
}
int main()
{
	cout<<"请你输入要输入数的个数:";
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&q[i]) ;
	guibing_sork(q,0,n-1);
	for(int i=0;i<n;i++)printf("%d ",q[i]);
	return 0;
}

结果.

在这里插入图片描述

总结。

归并排序在运用时要用双指针算法,且可按照:1找中间值。2递归。3归并来完成其归并算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值