编写swap)函数,实现将 main()函数中两个长度 样的整型数组a和b中对应元素相互交换。
如果是直接将数组a和数组b的每一个元素交换,可以向swap()函数传入数组a和数组b的地址,以及他们的长度,再在函数中交换它们对应元素的值即可。
代码如下:
#include <stdio.h>
void swap(int * a,int * b,int len){
// 遍历数组a和b的每一个下标
// 然后交换它们 对应的元素
for(int i=0;i<len;i++){
int temp = a[i];
a[i]=b[i];
b[i]=temp;
}
}
int main(void){
// 测试swap()函数
int a[5]={1,2,3,4,5};
int b[5]={6,7,8,9,10};
printf("交换数组前:\n");
printf("数组a里的元素为:\n");
for(int i=0;i<5;i++){
printf("%d ",a[i]);
}
printf("\n\n数组b里的元素为:\n");
for(int i=0;i<5;i++){
printf("%d ",b[i]);
}
swap(a,b,5);
printf("\n\n交换数组后:\n");
printf("数组a里的元素为:\n");
for(int i=0;i<5;i++){
printf("%d ",a[i]);
}
printf("\n\n数组b里的元素为:\n");
for(int i=0;i<5;i++){
printf("%d ",b[i]);
}
return 0;
}
基本实现
1)一般实现(需临时变量)
// 引用实现
Swap1(int &x, int &y)
{
int temp;
temp = x;
x = y;
y = temp;
}
// 调用
int x = 5;
int y = 6;
Swap1(x, y);
// 指针实现
Swap1(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
// 调用
int x = 5;
int y = 6;
Swap1(&x, &y);
2)利用异或操作实现(不需临时变量)
// 引用实现
void Swap2(int &x, int &y)
{
x ^= y;
y ^= x;
x ^= y;
}
// 调用
int x = 5;
int y = 6;
Swap2(x, y);
// 指针实现
void Swap2(int *x, int *y)
{
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
// 调用
int x = 5;
int y = 6;
Swap2(&x, &y);
3)利用加减操作实现(不需临时变量)
// 引用实现
void Swap3(int &x, int &y)
{
x = x + y;
y = x - y;
x = x - y;
}
// 调用
int x = 5;
int y = 6;
Swap3(x, y);
// 指针实现
void Swap3(int *x, int *y)
{
*x = *x + *y;
*y = *x - *y;
*x = *x - *y;
}
// 调用
int x = 5;
int y = 6;
Swap3(&x, &y);
宏定义实现
#define swap(x, y) { x ^= y; y ^= x; x ^= y; }
#define swap(x, y) { x = x + y; y = x - y; x = x - y; }
// 调用
int x = 5;
int y = 6;
swap(x, y);
模板实现
1)一般实现(需临时变量)
// 引用实现
template <class T> void Swap(T& x, T& y)
{
T temp;
temp = x;
x = y;
y = temp;
}
// 调用
double x = 5.5;
double y = 6.5;
Swap(x, y);
// 指针实现
template <class T> void Swap(T* x, T* y)
{
T temp;
temp = *x;
*x = *y;
*y = temp;
}
// 调用
double x = 5.5;
double y = 6.5;
Swap(&x, &y);
2)利用加减操作实现(不需临时变量)
// 引用实现
template <class T1, class T2> void Swap(T1& x, T2& y)
{
x = x + y;
y = x - y;
x = x - y;
}
// 调用
double x = 5.5;
double y = 6.5;
Swap(x, y);
// 指针实现
template <class T1, class T2> void Swap(T1* x, T2* y)
{
*x = *x + *y;
*y = *x - *y;
*x = *x - *y;
}
// 调用
double x = 5.5;
double y = 6.5;
Swap(&x, &y);
注意:由于异或实现,是针对整数实现的,故不建议利用模板实现。原因:当用模板方式实现利用异或方法交换两个数,调用时,交换函数传入两个double类型的变量,此时编译就会出错。
方法一:利用指针实现swap函数,具体实现方法和使用方法如下:
#include <iostream>
using namespace std;
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a[] = {1, 2, 3, 4, 5};
int b[] = {6, 7, 8, 9, 10};
int n = sizeof(a) / sizeof(int);
for (int i = 0; i < n; i++) {
cout << "a[" << i << "]=" << a[i] << ", b[" << i << "]=" << b[i] << endl;
swap(&a[i], &b[i]);
cout << "a[" << i << "]=" << a[i] << ", b[" << i << "]=" << b[i] << endl << endl;
}
return 0;
}
方法二:利用函数模板实现swap函数,具体实现方法和使用方法如下:
#include <iostream>
using namespace std;
template <typename T>
void swap(T &a, T &b) {
T temp = a;
a = b;
b = temp;
}
int main() {
int a[] = {1, 2, 3, 4, 5};
int b[] = {6, 7, 8, 9, 10};
int n = sizeof(a) / sizeof(int);
for (int i = 0; i < n; i++) {
cout << "a[" << i << "]=" << a[i] << ", b[" << i << "]=" << b[i] << endl;
swap(a[i], b[i]);
cout << "a[" << i << "]=" << a[i] << ", b[" << i << "]=" << b[i] << endl << endl;
}
return 0;
}