`
zxxapple
  • 浏览: 79072 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

不借助其它变量交换两变量值的三种算法

阅读更多

在学习程序语言和进行程序设计的时候,交换两个变量的值是经常要使用的。通常我们的做法是:定义一个新的变量,借助它完成交换。代码如下:

int a,b,t;
a=10; b=15;
t=a; a=b; b=t;


这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。

标准算法最大的缺点(其实根本不算缺点)就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?答案是肯定的!这里我们可以用至少三种算法来实现,他们是:
    1)算术运算
    2)指针操作
    3)位运算
    
1) 算术运算
简单来说,就是通过+和-运算来实现。代码如下:

int a,b;
a=10;b=12;
a=b-a;   //a=2;b=12
b=b-a;   //a=2;b=10
a=b+a;   //a=12;b=10


通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。

此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)

2) 指针操作
对 指针的操作实际上进行的是整数运算。比如:两个int指针相减得到一个整数N,该整数表示两个指针变量在内存中的储存位置隔了N*sizeof(int) 个字节;int指针和一个整数相加,例如“a+10”表示以a为基地址,偏移为10*sizeof(int)处的int变量。所以我们完全可以通过和算术 算法类似的运算来完成指针变量值的交换,从而达到交换变量的目的。即:

int *a,*b;    
a=new int(10);        //给指针赋值
b=new int(20);        //a=0x00030828,b=0x00030840
a=(int*)(b-a);        //a=0x00000006
b=(int*)(b-int(a));   //b=0x00030828
a=(int*)(b+int(a));   //a=0x00030840


需要注意的是:最后三句话中,只有第一句是两个指针之间的计算,其他都是指针和整数的计算,否则会导致计算错误,严重导致系统出错。

通过以上运算a、b的地址就完成了交换,a指向了原先b指向的值,b指向原先a指向的值!

此算法同样没有使用第三变量就完成了值的交换,与算术算法比较它显得不好理解,但是它有它的优点即在交换很大的数据类型时,比如说自定义的大型结构或者类,它的执行速度比算术算法快。因为它交换的时地址,而变量值在内存中是没有移动过的。(以下称为地址算法)

3) 位运算
通过异或运算也能实现变量的交换,这也许是最为神奇的,请看以下代码:

int a=10,b=12;  //a=1010^b=1100;
a=a^b;    //a=0110^b=1100;
b=a^b;    //a=0110^b=1010;
a=a^b;    //a=1100=12;b=1010;


此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着一个数a与任意一个给定的数b连续异或 两次,a的值不变。即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。

以上三个算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法在纯C中仅能完成标准数据类型的交换,对于结构体就无能为力了;而在C++中需要使用重载操作则也可以完成复杂类型的交换;指针算法则可以轻松的实现任意数据结构的交换。

介绍这三种算法并不是要应用到实践当中,而是为了探讨技术,展示程序设计的魅力。从中可以看出,数学中的小技巧对程序设计而言具有相当的影响力,运用得当会有意想不到的神奇效果。而从实际的软件开发看,标准算法无疑是最好的,能够解决任意类型的交换问题。

分享到:
评论

相关推荐

    交换两个变量的值,不使用第三个变量的方法及实现.pdf

    本文主要介绍了四种不使用第三个变量来交换两个变量值的方法,适用于C/C++编程语言。 1. **算术运算**: 这种方法基于算术运算,例如加减法或乘除法。通过巧妙地使用算术运算,可以在不借助额外变量的情况下完成...

    nihao.rar_代码 变量交换

    在某些支持位操作的语言中,如C/C++,还可以使用异或操作符(^)来交换变量值: ```c++ a = a ^ b; b = a ^ b; a = a ^ b; ``` 异或操作具有自反性和结合性,使得这个方法能无条件地交换两个变量的值。 标签...

    C#不借助第三个变量实现两整数交换

    c#中实现两个int变量的数值互换,在借助第三个变量做临时载体的情况下,非常简单。  int a = 10;  int b = 5;  int c ;  c = a;  a = b;  b = c;  如果不借助第三方变量,有几种实现的方法:  1....

    经典数据交换算法

    在计算机科学领域,数据交换是程序设计中的一个基础概念,涉及到如何在不借助额外变量的情况下交换两个变量的值。本文将深入探讨一种经典的无辅助变量的数据交换算法,并对其原理、应用以及潜在问题进行详细的分析。...

    JavaScript两个变量交换值的实现方法

    以上就是JavaScript中实现两个变量交换值的几种方法。每种方法都有其特定的应用场景和优势。对于初学者而言,理解这些不同的交换方法将有助于提升编程技巧。在实际应用中,选择合适的方法将取决于变量的类型、数据...

    前端面试算法题1

    以上是关于冒泡排序、快速排序以及不借助临时变量交换两个整数的相关知识点。这些算法在前端面试中经常被用来考察候选人的逻辑思维和编程能力。了解并熟练掌握这些基础算法对于提升前端开发者的技能水平至关重要。

    C算法,AB交换

    #include #define uchar unsigned char #define uint unsigned int sbit d=P3^0; sbit f=P3^2; sbit g=P3^3;

    C语言常用算法归纳.doc

    1. 交换算法:交换两个数的值,需要借助第三个中间变量。例如,交换两个整数的值,并输出交换后的结果。 2. 累加算法:累加算法的要领是形如“s=s+A”的累加式,必须出现在循环中才能被反复执行,从而实现累加功能。...

    C语言经典算法

    1. 交换:在C语言中,交换两个变量的值通常需要借助第三个变量,例如交换a和b的值,可以使用临时变量t。通过t存储a的值,然后将b的值赋给a,最后将t的值赋给b,这样就能完成交换。这种方法适用于任何数据类型的变量...

    详解易语言交换变量

    在易语言中,交换变量是一个常见的操作,它用于在不借助额外存储空间的情况下,将两个变量的值互换。这个过程在编程中经常出现,特别是在排序算法、数据处理和其他需要临时调整数据顺序的场景。 首先,我们来看如何...

    C语言常用算法归纳.pdf

    1. **交换**:在C语言中,交换两个变量的值通常需要借助第三个变量。例如,如果要交换两个整数a和b的值,可以使用一个临时变量t。代码示例: ```c int a, b, t; scanf("%d%d", &a, &b); // 交换 t = a; a = b; b = t...

    C语言基本算法简单级别.pdf

    在C语言中,通过借助第三个变量(如例1中的`t`)可以实现两个变量的值互换。这种"空杯子"的方法确保了数据交换的正确性,避免了直接操作两个变量导致的混乱。例如,当需要交换两个整数`a`和`b`时,可以先将`a`的值...

    两个书交换最小内存方法

    本篇将详细介绍两种不借助额外变量实现两个整数交换的方法:异或交换法与加减法,并通过C/C++及Java等语言进行示例。 #### 异或交换法 **异或交换法**是一种非常有趣的不使用额外变量来交换两个整数的方法。它基于...

    基于MATLAB的遗传算法实现

    在MATLAB中实现遗传算法,不仅可以利用其强大的数值计算能力,还可以借助其丰富的可视化工具来分析和理解算法的行为。 #### 初始化 在MATLAB中实现遗传算法的第一步是初始化。这涉及到创建一个初始种群,其中每个...

    matlab遗传算法工具箱

    - **交叉**:通过模拟生物学中的交叉配对,两个被选中的个体交换部分基因,生成新的个体。 - **变异**:随机改变某个个体中的某些基因值,增加种群多样性。 - **终止条件**:设定迭代次数或者适应度达到一定标准时...

    c代码-变量交换的一种方法

    在C语言中,变量交换是一个常见的操作,尤其是在处理数组、链表或进行排序算法时。本文将详细讨论标题和描述中提及的“变量交换”的一种方法,并通过分析提供的`main.c`源代码来深入理解这一概念。 首先,让我们...

    c语言算法应当掌握的一般算法

    交换两个变量的值通常需要借助一个额外的临时变量。例如,给定两个整数a和b,我们可以使用第三个变量t来辅助交换。代码如下: ```c int a, b, t; t = a; a = b; b = t; ``` 2. 累加 累加是将一系列数值相加的过程。...

    c++常用算法大全

    两数交换借助第三数 **目的**:实现两个整数的交换。 **方法一**:使用条件语句来输出较小和较大的数。 ```cpp #include using namespace std; int main() { int a, b; cin >> a >> b; // 使用条件运算符来...

    (完整版)非常全的C语言常用算法.doc

    在C语言中,由于没有内置的交换函数,我们通常需要借助第三个变量来实现。例如,如果要交换两个整数a和b,可以使用临时变量t。首先,将a的值存储在t中,然后将b的值赋给a,最后将t的值(原来的a)赋给b。这种方法...

Global site tag (gtag.js) - Google Analytics