交换两个数a,b的值:在运用到数组的时候要注意,不能是同一个元素
一般不会把数组同一个位置的元素传递给swap(int &,int &)函数。
但是,在快速排序中会出现这种情况,程序如下。
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<algorithm>
#include<string>
using namespace std;
void swap(int &a, int &b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
//low>=r的时候,返回low,sort函数挡住了这种情况
//在找第i个最小的数的时候,没去判断,所以分析了这个问题
int partion(int a[],int low,int r)
{
int i = low - 1;
int x = a[r];
for (int j = low; j <= r - 1; j++)
{
if (a[j] <= x)
{
i++;
swap(a[i], a[j]);
}
}
swap(a[r], a[i + 1]);
return i + 1;
}
void sort(int a[], int low, int r)
{
int part=0;
if (low < r)
{
part = partion(a, low, r);
sort(a,low,part-1);//part-1<low的情况再调用sort的时候会判断,不需要特殊处理
sort(a,part+1,r);
}
}
int main()
{
srand((unsigned int)time(NULL));
int a[10];
for (int &i : a)
{
i = rand() % 100;
}
for (int i : a)
{
cout << i << " ";
}
cout << endl;
sort(a, 0, 9);
for (int i : a)
{
cout << i << " ";
}
system("pause");
}
确定 取消
交换两个数有三种方法:
在编程过程中发现,前两种方法中,a,b的地址不能相同。
对于第三种方法,a,b地址可以相同。
举例:s[2]={1,2};
a=b=s[0];
a=a+b,则a=2,b=2
b=a-b,则b=0,a=0;
a=a-b,则a=0,b=0
因为地址相同,所以a,b值总是相同,如果用前前两种方法,会导致a,b全部被置为0。
void swap(int &a, int &b)
{
a = a+b;
b = a-b;
a = a-b;
}
void swap(int &a, int &b)
{
a=a^b;
b=a^b;
a=a^b;
}
void swap(int &a, int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}