两数交换的问题

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

交换两个数有两中最基本的方法,两数直接交换和通过第三方交换。

通过第三方交换是最安全的。两数直接交换有时候会导致一些问题。

请看下列:

这是一个最基本的选择排序算法

template<class T>

int Max(T a[],int n)

{

int pos=0;

for(int i=1;i<n;++i)

{

if(a[pos]<a[i])

pos=i;

}

return pos;

}

template<class T>

void Swap(T &lhs,T &rhs)

{

lhs=lhs+rhs;

rhs=lhs-rhs;

lhs=lhs-rhs;

}

template<class T>

void SelectionSort(T a[],int n)

{

for(int i =n;i>0;--i)

Swap(a[Max(a,i)],a[i-1]);

for(i=0;i<n;++i)

cout<<a[i]<<' ';

cout<<endl;

}

int main()

{

int a[]={4,3,9,3,7};

SelectionSort(a,5);

return 0;

}

注意,现在该算法的输出为: 0 3 4 7 9

无缘无故出来一个零,在该算法中只有Max这个函数采用引用来导入参数,问题就出在这里,

请看具体的过程,第一次取最大值后,数组为 4 3 7 3 9

第二次取最大值后,数组为 4 3 3 7 9

第三次取最大值后,数组为 3 3 4 7 9

第四次取最大值后,数组为 3 3 4 7 9

此时的max 的两个参数,lhs,rhs 指向了同一个值,也就是都是对 a[0]的引用。

在看lhs=lhs+rhs; rhs=lhs-rhs; lhs=lhs-rhs; 就导致了a[0]的值为0。

所以,在两数交换的时候,最好还是用第三方交换,以免出现不必要的错误。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航