AB交换问题

问题描述,给两个变量A和B,设计算法交换他们.一个合理的约定: A和B在内存内是连续的并且长度相同.对于不连续的,可以调用这个算法,因此这里只讨论连续的.

 

把问题简化,我们下面讨论int类型的.

 

answer1:

t = A; A = B; B = t;

评价:最朴素的想法,附加空间为O(1)

 

answer2:

A+=B; B = A-B; A-=B;

评价:没有附加空间, 但是可能溢出,要想不溢出也行,要加if语句判断情况

 

answer3:

A*=B; B=A/B; A/=B;

评价:2的一个变种,缺点更容易发生,写在这里只是想提示一下,方法2只是一个模式

 

answer4:

A^=B; B^=A; A^=B;

评价:比1少一个变量,速度相同,没有溢出,看起来是个不错的算法.

 

answer5:

对于支持swap指令的CPU,直接调用这个指令就OK了.

 

第一种方法不讨论,后面的2-4方法实际上想法是相同的:先让一个变量附带上两个变量都有的并且可还原的属性,然后在还原两个变量的同时随手把变量交换掉.2和3的缺点就是还原度不好,因为可能有溢出,因此不是好算法.

 

对于非int型的数据呢?比如double或者float[], 其实无所谓的,交换和数据类型是无关的,对于交换操作来看,要的只是字节数而已.当然,对于32位机来说,先4个字节4个字节的交换,然后再交换不足4个字节的部分,这样快些

 

最后,实际操作中你用哪个呢?我选择1或者4,如果不是大的结构体,就用1,速度照样很快,清晰明了.如果结构体比较大,那么用4,只是为了效率.

 

对于方法5,除非给定我操作平台,否则懒得写汇编代码.和方法5雷同的是高精度加减法问题,对于高精度加减法,实际上CPU内部的adc指令非常有效,使用这个指令的话运行效率不知道要比写c代码快多少倍.

 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值