两数交换

 

在排序算法中,我们经常需要交换两个数的值, 在进入算法之前,先在这里复习一下两数交换的实现方法,算是开胃小菜。

实现1

最简单的也是最常用的实现:

 

   1: void swap(int *a, int *b)
   2: {
   3:     int temp = *a;
   4:     *a = *b;
   5:     *b = temp;     
   6: }

 

然而面试官们常常并不满意这样的实现,他们很有可能要求我们不能使用其它内存,那么又有了下面两个实现方法。

实现2:

异或:

 

   1: void swap(int *a, int *b)
   2: {
   3:     *a = *a ^ *b;
   4:     *b = *a ^ *b;    
   5:     *a = *a ^ *b;
   6: }

 

实现3:

利用赋值操作符:

 

   1: void swap(int *a, int *b)
   2: {
   3:     *a = *a + *b - (*b = *a);
   4: }

 

看到实现3,警觉的同学常常会担心溢出的问题,事实是在这里不会有这种情况,我们可以写代码测试一下:

 

   1: void swap(unsigned int *a, unsigned int *b)
   2: {
   3:     *a = *a + *b - (*b = *a);
   4: }
   5:  
   6:  
   7: int
   8: main(int argc, char **argv)
   9: {
  10:     unsigned int a = 0xffffffff, b = 0xfffffffe;
  11:     
  12:     swap(&a, &b);
  13:     printf("a=%x, b=%x\n", a, b);
  14:     
  15:     return 0;
  16: }

 

运行结果:

 

   1: a=fffffffe, b=ffffffff
   2: 请按任意键继续. . .

 

很好,安全无侧漏,可以放心使用。

posted @ 2012-04-30 11:03  Newerth  阅读(1024)  评论(0编辑  收藏  举报