`
yuanyu5237
  • 浏览: 159360 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于两数交换的算法

阅读更多
#include <iostream>
using namespace std;

/* 优点:运算简单 ;缺点:忽略了溢出的问题 */
void swap1(int *a, int *b);
/* 优点:运算简单 ,不纯在溢出问题;缺点:若是两个数值相同的数 就不能交换 */
void swap2(int *a, int *b);

void swap3(int *a, int *b);

int main(void)
{
    int a,b;
    a=3;
    b=5;
    cout << "a=" << a << ",b=" << b << endl;
    swap1(&a, &b);
    cout << "a=" << a << ",b=" << b << endl;
    swap2(&a, &b);
    cout << "a=" << a << ",b=" << b << endl;
    swap3(&a, &b);
    cout << "a=" << a << ",b=" << b << endl;
    return 0;
}


void swap1(int *a, int *b)
{
    *a = *a-*b;
    *b = *b+*a;
    *a = *b-*a;
}
void swap2(int *a, int *b)
{
    *a=*a^*b;
    *b=*b^*a;
    *a=*b^*a;
}
void swap3(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}


更多资料参见http://hi.baidu.com/chengui0327/blog/item/be7be30109086e19738b653e.html
另外,还有一种方法,但我验证不正确,还需考虑:
void swap4(int *a, int *b)
{
    if(a <b)
    {
        a=(int*)(b-a);                      /* 用两个变量分配的地址来转换 */
        b=(int*)(b-(int(a)&0x0000ffff));     /* int(a)&0x0000ffff 为取低16位的偏移地址 */
        a=(int*)(b+(int(a)&0x0000ffff));
    }
    else
    {
        b=(int*)(a-b);
        a=(int*)(a-(int(b)&0x0000ffff));
        b=(int*)(a+(int(b)&0x0000ffff));
    }          /* 优点:不会溢出,可进行相同数值的交换; 缺点:运算复杂 且必须假设两待交换变量为指针类型  */
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics