1. 使用临时变量(最常用)
void swap_temp(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
优点:简单直观,可读性好,适用于所有数据类型
缺点:需要额外的存储空间
2. 算术运算法(加减法)
void swap_arithmetic(int *a, int *b) {
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
优点:不使用临时变量
缺点:可能发生整数溢出
3. 位运算法(异或交换)
void swap_xor(int *a, int *b) {
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
优点:不使用临时变量,不会溢出
缺点:可读性较差,a和b不能是同一变量(否则会变为0)
4. 乘除法(不推荐)
void swap_mul_div(int *a, int *b) {
*a = *a * *b;
*b = *a / *b;
*a = *a / *b;
}
优点:不使用临时变量
缺点:可能溢出,且除数不能为0,效率低
5. 使用宏定义
#define SWAP_MACRO(a, b) do { \
typeof(a) temp = a; \
a = b; \
b = temp; \
} while(0)
优点:类型通用,使用方便
缺点:宏可能带来副作用,调试困难
6. 使用指针运算(仅限指针变量)
void swap_ptr(int **a, int **b) {
int *temp = *a;
*a = *b;
*b = temp;
}
优点:适用于指针交换
缺点:仅适用于指针类型
7. 使用结构体(多值交换)
typedef struct { int x; int y; } Pair;
void swap_struct(Pair *p) {
int temp = p->x;
p->x = p->y;
p->y = temp;
}
优点:可以封装多个值的交换
缺点:需要定义结构体
8. 使用内联汇编(平台相关)
// x86架构示例
void swap_asm(int *a, int *b) {
asm volatile (
"movl (%0), %%eax\n"
"movl (%1), %%ebx\n"
"movl %%ebx, (%0)\n"
"movl %%eax, (%1)\n"
:
: "r"(a), "r"(b)
: "%eax", "%ebx"
);
}
优点:效率最高
缺点:平台相关,可移植性差
9. 使用C++特性(仅C++可用)
// C++版本
#include <utility>
void swap_cpp(int &a, int &b) {
std::swap(a, b);
}
优点:标准库实现,安全高效
缺点:仅适用于C++
10. 使用函数指针(复杂方法)
void swap(int *a, int *b, void (*swap_func)(int*, int*)) {
swap_func(a, b);
}
优点:可以动态选择交换算法
缺点:过于复杂,不实用
综合比较
方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
临时变量 | 简单可靠 | 需要额外空间 | 通用场景 |
算术运算 | 无临时变量 | 可能溢出 | 确定不会溢出的场景 |
位运算 | 无临时变量,不溢出 | 可读性差 | 嵌入式等资源受限环境 |
宏定义 | 类型通用 | 可能带来副作用 | 需要泛型交换的场景 |
内联汇编 | 最高效 | 平台相关 | 性能关键代码 |