算法设计与分析 3-14 分治法

本文介绍了分治法的基本思想和应用,包括使用分治法解决数组元素循环移动和计算逆序数问题的实例。在数组循环移动问题中,通过数学思路将数组分为两部分进行两次逆序处理;而在逆序数问题上,通过归并排序过程中计数逆序对,实现了高效解决方案。

3月14日 分治法相关练习记录

分治法是我们正式接触的第一个算法,它的求解可以简要概括为:
划分 求解子问题 合并
分治法要求子问题原问题之间形式相同,子问题之间相互独立,在实际运用中,如何划分让程序的时间空间复杂度尽可能降低是我们需要考虑的关键。

数组元素循环移动

题目内容:
设计分治算法实现将字符数组A[n]中所有元素循环左移k个位置,例如,对abcdefgh循环左移3位得到defghabc。

输入格式:
第一行为数组长度n
第二行为循环左移数k
第三行为数组中元素

输出格式:
循环左移k个位置后的结果

思路:
第一反应是考虑数组需要移动的数量k,如果k小于元素的数目n,那么创建第二个空数组,将前k个元素暂时存入新数组并删除,将剩余元素向前移动,完成后将新数组中元素接在原数组之后。
如果k大于n,那么使用模的思想,对元素的下标进行运算得出最终落点。
这种方法比较繁琐,可能需要占据一个新数组的空间,而且时间复杂度也高。
如果从使用分治法的思路来考虑,从网上检索得到了一种数学思路,同样将数组分成以k为划分的两个部分,通过两次逆序处理得到最终落点。

代码如下
*#include<stdio.h>
#include<stdlib.h>
#include;
using namespace std;
void math(char a,int start,int end){
int i;
char t;
for(i=0;i<(end-start+1)/2;i++){
t=a[start+i];
a[start+i]=a[end-i];
a[end-i]=t;
}
}
int main(void){
int n,k;
int i;
char a[1000];
char j;
cin>&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值