排序算法5——归并排序简析

排序任务可分为:

1.把前一半排序.

2.把后一半排序.(在这前两步用到递归,不在解释.)

3.把两半归并成新的有序数组.拷贝回原数组,排序完成.

#include<iostream>
#include<map>
using namespace std;
int a[10]={12,1,23,14,55,6,88,34,100,37};
int b[10];

void Merge(int a[],int s,int m,int e,int tmp[]) {
	//将数组a的局部a[s,m]和a[m+1,e]合并到tmp,并保证tmp有序,然后在拷贝回a[s,m]
	//归并操作的时间复杂度为:O(n)
	int pb=0;
	int p1=s,p2=m+1;//两段的首位 
	while(p1<=m&&p2<=e){//说明指针还没走到头 
		if(a[p1]<a[p2]) tmp[pb++]=a[p1++];
		else 			tmp[pb++]=a[p2++];
	}
	while(p1<=m)//如果仅p1指针没到头 
		tmp[pb++]=a[p1++];
	while(p2<=e)//如果仅p2指针没到头
		tmp[pb++]=a[p2++];
	for(int i=0;i<e-s+1;i++)
		a[s+i]=tmp[i];
	
}

void MergeSort(int a[],int s,int e,int tmp[]) {
	if(s<e){
		int m=s+(e-s)/2;
		MergeSort(a,s,m,tmp);//前一段排序 
		MergeSort(a,m+1,e,tmp);//后一段排序 
		Merge(a,s,m,e,tmp);//排完合并 
	}
}


int main()
{
	int size=sizeof(a)/sizeof(int);
	MergeSort(a,0,size-1,b);
	for(int i=0;i<size;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0; 
}

释义:

关于复杂度计算

为什么一直做到n/2^k=1.从上面的运算中我们发现,算式一直再往下分化,n/2,n/4,n/8......那么随着k的增大,什么时候结束呢?当等于1的时候(本身就是一个整体)就无法再分.

关于Merge函数

12 当前指针a指向44 第二次指针a指向55 第三次指针a指向56 第四次指针a指向77
10 当前指针b指向66 第二次指针b指向(不动,直到第五次指针a指向)768599

假设上面俩个为待归并的两个有序数组,两个指针a,b分别指向数组的两端,每次比较之后当前指向小的一方继续右移.然后与另一个相比较.最终排序完成.

10124455566676778589
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值