• 两数交换


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

    实现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: 请按任意键继续. . .

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

  • 相关阅读:
    第03组 Beta冲刺(4/5)
    第03组 Beta冲刺(3/5)
    第03组 Beta冲刺(2/5)
    第03组 Beta冲刺(1/5)
    第03组 Alpha冲刺(6/6)
    第03组 Alpha冲刺(5/6)
    软工实践个人总结
    最终作业
    Beta答辩总结
    Beta 冲刺(7/7)
  • 原文地址:https://www.cnblogs.com/newth/p/2476803.html
Copyright © 2020-2023  润新知