swap的实现(没有中间变量)

两数交换最常用的方法

void swap(int &a,int &b)

{

int temp=a;

a=b;

b=temp;

}

如果没有中间变量temp可以使用呢,还有其他的三种方法

第一种之加减法实现:

void swap1(int &a,int &b)

{

a=a+b;

b=a-b;

a=a-b;

}

缺点:在进行浮点数的交换时可能会造成精度的损失。

第二种之乘除法实现:

void swap2(int &a,int &b)

{

a=a*b;

b=a/b;

a=a/b;

}

缺点:也存在浮点数时精度损失的问题,而且要加约束条件a!=0&&b!=0;

第三种之异或实现

void swap3(int &a,int &b)

{

a^=b;//a的值为a^b

b^=a;//b=b^a=b^(a^b)=a^(b^b)=a^0=a

a^=b;//a=a^b=(a^b)^a=(a^a)^b=0^b=b

}

缺点:只能对整型数据进行交换不能对浮点型数据进行交换。

其实现主要是基于异或运算的如下性质:

1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0

2.任意一个变量X与0进行异或运算,结果不变,即X^0=X

3.异或运算具有可结合性,即a^b^c=(a^b)^c=a^(b^c)

4.异或运算具有可交换性,即a^b=b^a

 

时间: 2024-11-02 20:04:53

swap的实现(没有中间变量)的相关文章

关于swap交换操作的新方法

swap: 在oi中,swap用于交换两个变量的数值. 初学oi时,我们这样操作: 也就是说,需要一个temp变量来寄存x或y的值,因为当一个变量被赋值成为另一个变量时,没有temp它的值会丢失. 貌似很基础的亚子. 进阶版: 进阶版swap不在需要中间变量temp,常数也更优: 具体是这样的: int sswap(int &x, int &y) { x ^= y ^= x ^= y ; } 原理:一个数经过两次异或后,等于自己: 实在不理解手动膜你啦. 于是我们把上面的式子疯狂展开: 还

不用中间变量交换两个数 swap(a,b);

#include <iostream> using namespace std; int main () { int a = 3; int b = 5; cout<<"a="<<a<<",b="<<b<<endl; a = a+b; ///a=7 b = a-b; ///b=3; a = a-b; ///a=5 cout<<"a="<<a<<

从花式swap引出的pointer aliasing问题

上次,一个同学问我,你知不知道可以不用引入中间变量就可以实现swap? 我说,我知道,可以用加减法或者异或实现,像是这样 void mySwap(int &x,int &y) { x=x+y; y=x-y; x=x-y; } 或者这样 void mySwap(int &x,int &y) { x=x^y; y=x^y; x=x^y; } 但这种花式swap没什么意义,而且具有风险,那就是如果参数引用的是同一个变量,将产生错误的结果0. 这种问题叫pointer aliasi

swap函数 的几种实现与比较

前沿 swap函数 用于交换 a ,b 两个数.实现方法大同小异,其中不乏有好多版本,现在就其性能和可读性略作分析.不对指出还望指正.. 探讨: 其中的函数原型是: (1) void swap(int &a,int &b);传引用 (2)void swap(int *a,int *b);传地址 下面就第二个函数原型分析,代码如下: #include <stdio.h> #include <stdlib.h> /** 使用中间变量tmp */ void swap(in

C++中的swap(交换函数)

交换两个变量的值很简单. 比如 int a = 1; b = 2; 交换a b的值 这个很简单 很容易想到的是找个中间变量比如  int temp  = a; a = b; b = temp; 不需要中间变量可不可以? 当然是可以的. 比如 [加减法] a = a + b; b = a - b; a = a - b; 该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据: a = 3.123456 b = 1234567.000000 交换后各变量值变为:

Leetcode-24 Swap Nodes in Pairs

#24. Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should use only constant space. You may not modify t

swap function &amp; copy-and-swap idiom

在C++中,众所周知在一个资源管理类(例如含有指向堆内存的指针)中需要重新定义拷贝构造函数.赋值运算符以及析构函数(Big Three),在新标准下还可能需要定义移动构造函数和移动赋值运算符(Big Five).但实际上,这条规则还可以有一个小扩展.就是在资源管理类中,往往需要重新定义自己的swap函数来作为优化手段. 1. swap函数 首先考察如下例子,假设类HasPtr中含有一个指向string的指针 *ps 和一个int类型值value. class HasPtr { public: .

chapter8:Linux磁盘与文件系统管理之(5)swap的构建

当内存不够时,为了让后续的程序可以运行,将在内存中暂不用的程序调到swap.因此用到swap时性能会下降.现在一般个人电脑不会用到swap了,不过服务器还是有可能用到,但是我们一般都还是设置一下. 1.利用物理分区构建swap 2.利用文件构建swap(loop设备)

[Linux]创建和启用Swap交换区

如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存是一个不错的选择,我购买的DigitalOcean VPS 512M内存基本不够用的,好在VPS的母鸡使用的SSD,正常读写速度都在300MB/s以上,启用swap后性能提高了不少,特别是在处理消耗大内存的脚本方面 创建交换区原则:1.创建的swap交换区大小应该大于实际物理内存的容量大小,但是不要过大,以免造成硬盘空间浪费.2.如果内存IO请求频繁,而单一