思想:对于数列,设其全排列用集合
表示。其全排列集合可以用一种递归方式定义:
程序实现可以用递归实现,代码如下:
void print_it(int arr[], int n);
void arrange_all(int arr[], int size, int pos);
void swap(int& a, int&b);
int main()
{
int a[4] = {1, 2, 3, 4};
arrange_all(a, 4, 0);
return 0;
}
/*
函数名: void arrange_all( int arr[], int size, int pos)
描述: 打印所有排列
参数: arr[] 排列存放的数组
size 要排列的数据个数
pos 当前排列位置
*/
void arrange_all( int arr[], int size, int pos)
{
int i, tmp;
if (pos + 1== size) //如果已经排到最后
{
print_it(arr,size); // 打印数组
return;
}
for (i = pos; i < size; i++) //对当前位置后的所有位置排列
{
swap(arr[pos],arr[i]);// 交换
arrange_all(arr, size, pos + 1); //递归,继续后面的调用
swap(arr[pos],arr[i]);// 再交换回来,保持原有的排列次序
}
}
/*
函数名: print_it(int arr[], int n)
描述: 打印数组
参数: arr[] 需要打印的数组
n 数组的长度
*/
void print_it(int arr[], int n)
{
int i;
static int cnt = 0;
printf("%04d: ", ++cnt);
for (i = 0; i < n; i++)
printf("%2d ", arr[i]);
printf(" \n");
}
/*
函数名: swap(int &a,int&b)
描述: 交换
*/
void swap(int &a,int&b)
{
int tmp = a;
a=b;
b=tmp;
void arrange_all(int arr[], int size, int pos);
void swap(int& a, int&b);
int main()
{
int a[4] = {1, 2, 3, 4};
arrange_all(a, 4, 0);
return 0;
}
/*
函数名: void arrange_all( int arr[], int size, int pos)
描述: 打印所有排列
参数: arr[] 排列存放的数组
size 要排列的数据个数
pos 当前排列位置
*/
void arrange_all( int arr[], int size, int pos)
{
int i, tmp;
if (pos + 1== size) //如果已经排到最后
{
print_it(arr,size); // 打印数组
return;
}
for (i = pos; i < size; i++) //对当前位置后的所有位置排列
{
swap(arr[pos],arr[i]);// 交换
arrange_all(arr, size, pos + 1); //递归,继续后面的调用
swap(arr[pos],arr[i]);// 再交换回来,保持原有的排列次序
}
}
/*
函数名: print_it(int arr[], int n)
描述: 打印数组
参数: arr[] 需要打印的数组
n 数组的长度
*/
void print_it(int arr[], int n)
{
int i;
static int cnt = 0;
printf("%04d: ", ++cnt);
for (i = 0; i < n; i++)
printf("%2d ", arr[i]);
printf(" \n");
}
/*
函数名: swap(int &a,int&b)
描述: 交换
*/
void swap(int &a,int&b)
{
int tmp = a;
a=b;
b=tmp;
}