《算法设计与分析》——子数组换位问题

参考:经典算法之子数组换位问题

1. 问题

设a[0:n-1]是一个有n个元素的数组,k(0<=k<=n-1)是一个非负整数。
试设计一个算法将子数组a[0:k]与a[k+1,n-1]换位。要求算法在最坏情况下耗时O(n),且只用到O(1)的辅助空间。

2. 一般算法

2.1 初步思考

最简单的方法就是循环(n-(k+1))次=(n-k-1)次,将a数组的末尾数字插入到a[0]之前。

注:a[0:k]与a[k+1,n-1]的长度不一定相同。

2.2 具体做法

  1. 首先开辟一个额外空间temp用于存放每一次a数组的末尾数据;
  2. temp ← a[n-1] ;
  3. 将a[0: n-2]每个数据都依次向后移动一位赋值给a[1: n-1];
  4. a[0] ← temp;
  5. 循环执行2 - 4 步(n-k+1)次。

2.3 代价分析

时间代价: O((n-1)*(n-k+1)) 即O(n^2)数量级;

空间代价: O(1)

3. 采用分治算法

  • 当a[k]左边子数组的长度等于右边的子数组长度时,直接将两个子数组对应的元素互换即可
  • 当左边子数
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值