美文网首页
C++全排列算法

C++全排列算法

作者: 篮筐轰炸机5号 | 来源:发表于2019-01-05 21:58 被阅读0次

参考:【基础算法】- 全排列

代码参考上面链接,花了一些功夫才读懂,添加了注释。

经验是:读代码时拿纸笔模拟单步执行,方便理解。

还学到了不申请额外空间完成值交换的骚操作。感谢作者。

#include <iostream>
using namespace std;

//交换数值的骚操作,三个异或。
void swap(char* array , int i , int j){
    //位操作输入有4种情况,异或操作^的输出0、1数量是2:2,能保持足够的信息量。&、|的结果则是1:3,3:1。
    //C没有同或。
    if(i != j){
        array[i]^=array[j];array[j]^=array[i];array[i]^=array[j];
    }
}

void allsort(char* array , int start , int end){
    
    if(start < end-1){//当元素数>=1时
        for(int i = start ; i < end; i++){
            //把第一个元素分别和后面的元素交换,相当于轮流将a,b,c放到第一的位置
            swap(array , i , start);
            //确定了新的第一元素后,递归排列后面的
            allsort(array , start+1 , end);
            //再交换回来,恢复原顺序。否则元素位置错乱,以后无法保证每个元素都被换到第一的位置
            swap(array , i , start);
        }
    }else{//当只剩1个元素时
        for(int i = 0 ; i < end ; i++) {
            cout << array[i];
        }
        cout << endl;
    }
}

int main(int argc, const char * argv[]) {
    char array[] = {'a','b', 'c','d'};
    allsort(array,0,4);
    return 0;
}

输出结果如下:

abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac
cbad
cbda
cabd
cadb
cdab
cdba
dbca
dbac
dcba
dcab
dacb
dabc

相关文章

  • C++全排列算法

    参考:【基础算法】- 全排列 代码参考上面链接,花了一些功夫才读懂,添加了注释。 经验是:读代码时拿纸笔模拟单步执...

  • 46. Permutations

    算法 1: 递归数组 的全排列,等价于全排列与可能的取值组合得到。 算法 2: 计算一个排列 按字典升序排列的紧...

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{1,2,3,4}的例子进行全排列,其可以分解...

  • 生成全排列算法(Scala和C++实现)

    全排列问题描述为:给定一串数字,生成所有可能的排列。本文给出两类,一种使用C++通过回溯算法,一种使用Scala通...

  • 全排列算法

    参考资料 先上代码,实现非常简洁 输出 主要思路 在此树中,每一个从树根到叶子节点的路径,就对应了集合A的一个排列...

  • 全排列算法

    4个数的全排列 结果 任务分配问题

  • 全排列算法

    问题: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,...

  • 全排列算法

    题目:给定元素a,b,a,b,c,c,d,求解出所有的排列。思路:首先这道题的算法是一个比较经典的算法,它并不是使...

  • 全排列算法

    代码实现 参考资料 全排列算法 - bilibili.com

  • 全排列算法

    问题描述: 对于一个给定的序列 a = [a1, a2, a3, … , an],请设计一个算法,用于输出这个序列...

网友评论

      本文标题:C++全排列算法

      本文链接:https://www.haomeiwen.com/subject/cpbdrqtx.html