1.全排列:
template<class Type>
void Swap(Type &a,Type &b)
{
Type c = a;
a = b;
b = c;
}
void Perm2(int arr[], int start, int end)
{
if(NULL == arr)
{
return;
}
if(start == end)//走到最后以为 进行打印
{
for(int i=0; i<=end; i++)
{
cout << arr[i] <<" ";
}
cout << endl;
}
else
{
for(int i=start; i<=end; i++) //以第i个为基准不要动 交换其他的进行全排列
{
swap(arr[i], arr[start]);//全排列调用两次交换函数一次递归 而全部子集调用01赋值后调用两次递归
Perm2(arr, start+1, end);//这里不能传i的原因是:i代表基准值的下标与第一个数进行交换,然后剩下两个全排列打印,数组长度才012,这里如果传i,那么递归调用就传2+1了,越界了
swap(arr[i], arr[start]);//交换玩之后,重新交换回来,让i重新指定基准值 与第一个值进行交换 //这里应该传start,让其指向最后一个数的下标时就打印
} //递归不能传i的原因 就是当i==end的时候 递归i+1会越界
}
}
int main()
{
int ar[]={1,