交换两个数有两中最基本的方法,两数直接交换和通过第三方交换。
通过第三方交换是最安全的。两数直接交换有时候会导致一些问题。
请看下列:
这是一个最基本的选择排序算法
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。
所以,在两数交换的时候,最好还是用第三方交换,以免出现不必要的错误。