在排序算法中,我们经常需要交换两个数的值, 在进入算法之前,先在这里复习一下两数交换的实现方法,算是开胃小菜。
实现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: 请按任意键继续. . .
很好,安全无侧漏,可以放心使用。