算法设计与分析基础--分治法

一、实现思想

1.将一个问题划分为同一类型的若干子问题,子问题最好规模相同
2.对子问题求解(一般使用递归方法)
3.有必要的话,合并子问题的解,得到原始问题的答案

下图描述的是将一个问题划分为两个较小子问题的例子,也是最常见的情况:
在这里插入图片描述

二、分治算法之 合并排序

1.主要思想

对于一个需要排序的数组A[0…n-1],将其一分为二:A[0…n/2-1]和A[n/2…n-1] (n/2向下取整),对每个子数组递归排序,然后把这两个排好序的子数组合并为一个有序数组

Mergesort(A[0...n-1])
//递归调用Mergesort对数组A[0...n-1]进行排序
//输入:一个可排序数组A[0...n-1]
//输出:非降序排列数组A[0...n-1]
if n>1
	copy A[0....n/2-1] to B[0....n/2-1]
	copy A[n/2....n-1] to C[0....n/2-1]
	Mergesort(B[0....n/2-1])
	Mergesort(C[0....n/2-1])
	Merge(B,C,A) //合并
Merge(B[0....p-1],C[0....q-1],A[0....p+q-1])
//将两个有序数组合并为一个有序数组
//输入:两个有序数组B[0....p-1]和C[0....q-1]
//输出:有序数组A[0....p+q-1]
i=0;j=0;k=0
while i<p and j<q do
	if B[i]<=C[j]
		A[k]=B[i]
		i++
	else
		A[k]=C[j]
		j++
	k++
if i=p  //这里不会出现i=p,j=q的情况
	copy C[j...q-1] to A[k....p+q-1]
else
	copy B[i...p-1] to A[k...p+q-1]

可参考:合并(归并)排序原理及代码实现(c/c++)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值