算法分析与实践-作业4-二分归并排序

1. 问题

对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k

2. 解析

二分归并排序是典型的分治算法的应用。
不断将数组规模分解为原来的1/2,直至无法分解。
再不断升序归并,最终归并为一个升序数组。
在这里插入图片描述

3. 设计

void merge(int a[],int b[],int start,int middle,int end) {
	for (int i = start; i <=end; i++)
	{
		b[i] = a[i];
	}
	int starta, startb, enda, endb,i=start;
	starta = start;
	enda = middle;
	startb = middle + 1;
	endb = end;
	while (starta<=enda&&startb<=endb)
	{
		if (b[starta]<b[startb])
		{
			a[i++] = b[starta++];
		}
		else
		{
			a[i++] = b[startb++];
		}
	}
	while (starta <= enda)
	{
		a[i++] = b[starta++];
	}
	while (startb <= endb)
	{
		a[i++] = b[startb++];
	}
}
void mergeSort(int a[],int b[],int start,int end) {
	int middle;
	if (start<end)
	{
		middle = start + (end - start) / 2;
		mergeSort(a,b,start, middle);
		mergeSort(a,b,middle + 1, end);
		merge(a,b,start, middle, end);
	}
}

4. 分析

Merge算法比较次数:
最坏情况,比较n-1次
最好情况,比较n/2次

复杂度:
W(n)=2W(n/2)+n-1,n=2k
W(1)=0

W(n)=nlogn-n+1
时间复杂度为O(nlogn)

5. 源码

https://github.com/LonelyTaker/Algorithm-analysis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值