参考:经典算法之子数组换位问题
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 具体做法
- 首先开辟一个额外空间temp用于存放每一次a数组的末尾数据;
- temp ← a[n-1] ;
- 将a[0: n-2]每个数据都依次向后移动一位赋值给a[1: n-1];
- a[0] ← temp;
- 循环执行2 - 4 步(n-k+1)次。
2.3 代价分析
时间代价: O((n-1)*(n-k+1)) 即O(n^2)数量级;
空间代价: O(1)
3. 采用分治算法
- 当a[k]左边子数组的长度等于右边的子数组长度时,直接将两个子数组对应的元素互换即可
- 当左边子数