swap函数的几种写法

转载 2015年11月18日 12:59:04
你会写几种swap函数?


swap函数估计是一个各种各样程序都会频繁用到的子程序,可是你知道它究竟有多少种不同的写法吗?下面我就列举我知道的几种swap函数来跟大家分享一下。

(1)经典型---嫁衣法

无论是写程序还是干其他事情,一旦涉及到交换,就总是会遇到第三方。这个第三方可能是公正的监督者,也可能是一个徒为他人做嫁衣的可怜虫。在经典法的交换程序中,我们就需要有一个可怜虫来为我们提供暂时的服务。程序如下:


void swap(int *a,int *b)
{
    int temp=*a;
    *a=*b;
    *b=temp;
}

我们看到,我必须用一个temp变量作为过渡,让他先拥有然后又再赋值给其他人。可见他也不是徒做嫁衣,而是先索取后奉献的主人公精神。哈哈,扯远了。


(2)经典型改进版---范型法

上面的那个swap函数只能交换int类型变量,如果我想交换double类型,short类型,char类型......呢?上面的程序就必须重新写,可是又不是完全推倒重来,只需要修改相应的类型变量就可以了,如果是用C++来编程,我们还可以用到NB的模板,可是C语言就没有这种特点了。唯一可以用的便是void*指针。void*指针可以视为一种通用指针,任何指针都可以转换为void*指针而不会丢失值。同理,只要我们把原先的指针变量换成void*类型不就行了。可是,你很快发现,这样不行。为什么呢?因为我们没有通用的嫁衣。C语言中的变量不可以为void类型,也就是说没有void temp; 这种古怪的东西。那怎么办呢?我们可以从底层去想两个数交换的本质。不就是相应的内存值交换嘛。我们可以联想到memcpy函数,我们可以模仿着来,写一个函数,通过传入void*指针和变量类型的字节大小,来将这两个变量相应的字节内容发生对换。程序如下:


void swap(void *a,void *b,size_t size)
{
	unsigned char *p1=(unsigned char *)a; //强制类型转换
	unsigned char *p2=(unsigned char *)b;
	unsigned char temp; //字节型的嫁衣
	while(size--)
	{
		temp=*p1;
		*p1=*p2;
		*p2=temp;
		p1++;
		p2++;
	}
}

使用的时候可以这样调用:swap( &a,&b,sizeof(int) );
这种字节的分别交换可以通用各种类型的交换,当然,彼此之间应该是同种类型,否则会因为类型大小,字节序等一些问题发生错误。


(3)取巧型---赋值法
这个方法其实一个很取巧的方法,大家先看一下程序,看能不能看出巧在哪里:

void swap(int *a,int *b)
{
	*a=*a+*b;
	*b=*a-*b;
	*a=*a-*b;
}
这种方法有一个好处,那就是不用消耗额外的变量空间,只需要两个变量做一些运算即可。让我们慢慢看:
首先:

我用A代表a+b

A=a+b, 这时候A的值为两者之和

接着,b=A-b, 也就是b=A-b=a+b-b=a,这时候b得到了a的值
最后,a=A-b, 因为经过上面的运算,b=a,所以a=A-b=a+b-a=b,这时候a得到了b的值。

所以,交换成功了。



(4)诡异型---逻辑运算法
如果没有仔细拿纸算一算的话,这段程序估计会晕倒很多人,让我们来看一下吧:

void swap(int *a,int *b)
{
	// *a^=*b^=*a^=*b; 这种做法达不到效果,不知道为什么
	*a=*a^*b;
	*b=*b^*a;
	*a=*a^*b;
}
怎么样,够诡异的吧。如果我们把它拆开来看的话,其实也没那么可怕:
首先我们必须明确运算顺序,是从右至左:
*a=*a^*b;
*b=*b^*a;
*a=*a^*b;
在解释这段代码的时候,我们先普及一下逻辑运算的基础知识,^ 符号是异或符号,也就是如果两个逻辑变量各不相同,其表达式值为1,反之为0 。则有:

A^A=0

A^1=~A
A^0=A
A^B^C=A^(B^C)=B^(A^C)

首先,A=a^b;

接着,b=b^A=b^a^b=a^0=a,这时候b获得了a的值。

最后,a=A^b=a^b^a=b^0=b,这时候a获得了b的值。



SWAP函数的几种写法

你会写几种swap函数?        swap函数估计是一个各种各样程序都会频繁用到的子程序,可是你知道它究竟有多少种不同的写法吗?下面我就列举我知道的几种swap函数来跟大家分享一下。 (1...
  • u013593035
  • u013593035
  • 2014年09月28日 20:29
  • 1484

mips汇编语言之实现swap函数

此程序用来交换两个整数已在pcspim下编译通过#########################################################      programed by ...
  • yihaozou
  • yihaozou
  • 2008年10月15日 20:35
  • 3164

C语言swap函数

http://blog.sina.com.cn/u/2943212997 c语言中的swap函数:     void swap(int *a, int *b) {         ...
  • u012349696
  • u012349696
  • 2014年02月19日 17:50
  • 6310

main函数的多种写法

int main( int argc, char **argv ) { ......... return 0; } int main( void ) { ...
  • wjhyxr
  • wjhyxr
  • 2016年05月13日 21:42
  • 323

【转】SWAP函数的几种写法

大一的时候深入理解swap,现在又翻出来了~~~原文地址:【转】SWAP函数的几种写法作者:如水 你会写几种swap函数?        swap函数估计是一个各种各样程序都会频繁用到的子程...
  • LC_1994
  • LC_1994
  • 2015年10月30日 18:57
  • 495

函数的几种写法以及重载

function  fun1()    {    alert("无参");    }  第一种写法 已经调用方式:fun1(); PS:这种调用方式和JAVA没什么区别 第二种 ...
  • yingjialovezhu
  • yingjialovezhu
  • 2016年05月30日 10:55
  • 139

几种交换两个数函数(swap函数)的写法和解析

#include using namespace std; /*值传递,局部变量a和b的值确实在调用swap0时变化了,当结束时,他们绳命周期结束*/ void swap0(int a, int ...
  • Lucky_mn
  • Lucky_mn
  • 2013年08月20日 17:06
  • 2850

JAVA for循环的几种写法和效率

String[] stringS = {"A","B","C","D"}; Collection stringlists = java.util.Arrays.asList(stringS...
  • lsqbeyond
  • lsqbeyond
  • 2014年11月26日 16:16
  • 587

Swap函数实现

Swap函数 基本实现1)一般实现,借助临时变量// 引用实现 Swap1(int &x, int &y) { int temp; temp = x; x = y; y...
  • yzhang6_10
  • yzhang6_10
  • 2016年04月04日 15:21
  • 2744

java中swap函数的实现分析

实践是检验真理的唯一标准,java代码: public class TestReference { public static void main(String[] args) { ...
  • xuxurui007
  • xuxurui007
  • 2012年06月10日 16:26
  • 17164
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:swap函数的几种写法
举报原因:
原因补充:

(最多只允许输入30个字)