核心思想是交换,具体来说,对于一个长度为n的串,要得到其所有排列,我们可以这样做:
1.把当前位上的元素依次与其后的所有元素进行交换;
2.对下一位做相同处理,直到当前位是最后一位为止,输出序列;
需要注意的一点:思想是“交换”,也就是直接对原数据进行修改,那么在交换之后一定还要再换回来,否则原数据就发生变化了,肯定会出错
如果觉得上面的解释还是很难懂的话,那么记住这句话:核心思想就是让你后面的所有人都和你交换一遍(而你是一个指针,从前向后按位移动...)
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
网友评论