排序算法七:递归--排列组合

排列组合

  • 一、案例
  • 二、算法与分析
    • 1、思路分析
    • 2、递归代码
    • 2、递归过程
    • 3、代码分析
  • 三、完整代码

一、案例

输入指定字符串,例:“abc”
打印出此字符串的所有组合
abc
acb
bac
bca
cba
cab

二、算法与分析

1、思路分析

普通思路写法:

#include 

using namespace std;

void Permutations(char*p,const int k,const int m){  // k为数组起始下标,m为数组末尾下标
    // a 开头的,后面跟着 b c 的所有排列
    swap(p[0],p[0]);
    Permutations(p,1,2)
    swap(p[0],p[0]);
    
    // b 开头的,后面跟着 a c 的所有排列
    swap(p[0],p[1]);
    Permutations(p,1,2)
    swap(p[0],p[1]);
    
    // c 开头的,后面跟着 a b 的所有排列
    swap(p[0],p[2]);
    Permutations(p,1,2)
    swap(p[0],p[2]);
}

int main()
{
    char S[] = "abc";
    Permutations(S,0,2);
    return 0;
}

将Permutations();进行整合成for循环,再加上终止判断
即得下面递归代码。

2、递归代码

void Permutations(char*p,const int k,const int m){
    for(int i = k;i <= m;i++){
        swap(p[k],p[i]);//“交换1” 将指定位置的元素与当前首位元素交换
        Permutations(p,k+1,m);//将首位元素后一位的元素设置为首位元素,并进入递归序列
        swap(p[k],p[i]); //“交换2” 恢复成“交换1”之前的位置
    }
}

2、递归过程

排序算法七:递归--排列组合_第1张图片

3、代码分析

#include 

using namespace std;

int timer = 0;
int timer2 = 0;

void Show(string s,char *p,int m){
    cout<

三、完整代码

#include 

using namespace std;

void Permutations(char*p,const int k,const int m){		// k为数组起始下标,m为数组末尾下标
    if(k==m){   //结束判断
        for(int i = 0;i<=m;i++){
            cout<

输出结果:
abc
acb
bac
bca
cba
cab

你可能感兴趣的:(数据结构--C++描述,c++)