全排列

求全排列最简单的就是递归了
123 的全排列共有 6 个, 123 的全排列等于以 1 开头 23 的全排列, 加上以 2 开头 13 的全排列,加上以 3 开头 21 的全排列。

一个数列的全排列就是每一个数分别与第一个数交换(每一个数字都做一回头)后所得数列全排列的和。去掉第一个数字,后面数列的全排列怎么求???显然一样的求法,递归就行。

什么时候结束递归呢???显然当只剩下一个数字的时候就求得了一个全排列。

permutation.jpg
#include 

void swap(int a[], int i, int j) {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

void permutation(int a[], int begin, int end) {
    if (begin == end - 1) {
        for(int i=0; i

关于去重,例如 122,上面的算法仍然会输出 6 个数列,怎么去除重复的排列呢??? 网上说的是假如要交换的两个数字下标是 i, j (i 是头) 只有当 [i,j) 之间没有和 a[j] 相同的数字才交换。我也不大理解,水平太菜, 这个递归排列我都理解了好长时间????

bool canSwap(int a[], int i,int j) {
    // 只有当 [i,j) 之间没有和 a[j] 相同的数字才交换
    for(int x=i; x

你可能感兴趣的:(全排列)