google面试题及我的算法(1)——交叉换位(完美版)

对“google面试题及我的算法(1)——改进”的再改进

不需要移动,通过交换完成,只需一个交换空间

例如,N=9时,第2步执行后,实际上中间位置的两边对称的4个元素基本配对,只需交换中间的两个元素即可,如下表所示。颜色表示每次要交换的元素,左边向右交换,右边向左交换。交换过程如下表所示。

交换x1,x3;交换x2,x4;再交换中间的x1,x4;交换y1,y2

算法思想:

N=9为例(中间的竖表示中间位置):

   a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 | b1 b2 b3 b4 b5 b6 b7 b8 b9

  头尾的元素不需任何操作

1. 左边从位置left=2开始,右边从位置n+1开始,向右交换count=1个元素,即a2,b1交换

  右边从位置right=2n-1开始,左边从位置n开始,向左交换count=1个元素,即b8,a9交换

  序列变为:

   a1 b 1 a 3 a 4 a 5 a 6 a 7 a 8 b8 | a2 b2 b3 b4 b5 b6 b 7 a 9 b9

  故已经成功放好位置的有(a1,b1),(a9,b9)

  其中(a8,b8),(a2,b2)也配对,只需将其交换到相应的位置即可

2. 左边从位置left=3开始,右边从位置n+1开始,向右交换count=2个元素,即a 3 a 4 a2 b2交换

  右边从位置right=2n-2开始,左边从位置n开始,向左交换count=2个元素,即b6 b7 a8 b8交换

  序列变为:

   a1 b 1 a 2 b 2 a 5 a 6 a 7 b6 b7 | a 3 a 4 b3 b4 b 5 a 8 b 8 a 9 b9

  故又成功放好位置的有(a2,b2),(a8,b9)

3. 左边从位置left=5开始,右边从位置n开始,已不能满足交换count=4个元素的要求,故退出循环

4. 序列缩小为a 5 a 6 a 7 b6 b7 | a 3 a 4 b3 b4 b5, 对序列中没有放好的数据按快处理

将序列看作:x1=(a5) y1=(a 6 a 7 b6) x2=(b7) | x3=(a3) y2=(a4 b3 b4) x4=(b5)

交换x1,x3;交换x2,x4;再交换中间的x1,x4;交换y1,y2

此时序列变为S1a 3 a 4 b3 b 4 a 5 b 5 a 6 a 7 b6 b7

5. 若交换到左边的b有配对的a,则中间的序列S2=(a5 b6)作为新的序列;否则将S1作为新的序列;对该序列进行上述操作,直到所有元素都放到正确的位置

此例中,(a6,a7,b6,b7),(a3,a4,b3,b4)以配对,只需交换中间的两个元素即可,序列缩小a5 b5

 

==========

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值