交换两个数的值的四种方法

  交换两个数的值时,大致分为两种思路,建立临时变量和不建立临时变量,这里我们按照是否建立临时变量来写。

一、建立临时变量

    <1>、一般方法

              思路:建立临时变量 tmp ,通过 tmp = a; a = b; b = tmp; 来实现。

              图解:(以 a = 1; b = 2 为例)

                       交换两个数的值的四种方法_第1张图片

                       

              具体的代码实现:

void swop1(int x, int b)
{
    int tmp = x;
    x = y;
    y = tmp;
}


               缺点:这是一种假交换,只是在函数内部进行了交换,当函数执行完毕后,函数栈帧被释放,原来的值并未改变。

                          (形参是实参的一份临时拷贝)

      <2>指针:因第一种方法并未真正被改变,故利用指针弥补这一缺陷,过程基本一致,但可以改变原值

           思路:传址,过程原理与传值的思路相同,只是传过来的是地址

            具体代码实现:

void swop2(int *x,int *y)             //传址
{
    int tmp = *x;
    *x = *y;
    *y = tmp;
}


二、不建立临时变量

 <1>、加减运算交换

               思路:利用加减运算,交换值

                图解:(以 a = 1; b = 2 为例)            

            交换两个数的值的四种方法_第2张图片

                   具体的代码实现:

void swop3(int x, int y)
{
    x = x + y;
    y = x - y;
    x = x - y;
}


                    缺陷:(1)、同样是传值,函数结束后,原值不会改变

                               (2)、可能会越界,故适用于数值较小的时候

     <2>、位运算方法

             首先,先说一下位运算的方法:相同为0,不同为1

                      (即 a ^ a = 0, 0 ^ b = 1)

             思路:

                      eg:a = 3; b = 5;      a 的二进制为 0011 ,b 的二进制为0101

                             a = a ^ b;           //a = 0110 = 6

                             b = a ^ b;           //b = 0011 = 3

                             a = a ^ b;           //a = 0101 = 5

              具体代码实现:

void swop4(int x,int y)
{
    x = x ^ y;
    y = x ^ y;
    x = x ^ y;
}

 


--------------------- 
作者:lxt-cn 
来源:CSDN 
原文:https://blog.csdn.net/qq_41999654/article/details/81835027 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(数据结构,算法)