算法分析(课程笔记)

目录

希望通过写博客 促进自己学习,都是课本上算法的实现,随课程更新

递归与分治

全排列

基本思路就是分治,大问题化小问题。

假设 R={A B C D},对R进行全排列,会有24种结果。把R划分为{A | B C D},假定A已经排列好了,只需要再排列{B C D}既可。这就可以通过递归来实现了。(第一个排列好的其他划分:{B | A C D} {C | A B D} {D | A B C})

#include <iostream>
#include <cstdio>
#include <cstdlib>

template <class T>
void swap(T &a, T &b)   //交换函数
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}

void print(char e)  //输出函数
{
    printf("%c ", e);
}

//perm函数,k为开始位置,m为序列元素个数,void (*print)(T e)为输出函数指针。
//perm函数会从k开始对m个元素进行全排列
template <class T>
void perm(T list[], int k, int m, void (*print)(T e))
{
    if(k==m)
    {
        for(int i = 0; i < m; i++)
            print(list[i]);
        printf("\n");
    }
    else
    {
        for(int i = k; i < m; i++)
        {
            swap(list[k], list[i]);    //两个swap在下面解释
            perm(list, k+1, m, print);
            swap(list[k], list[i]); 
            
        }
    }
}

int main()
{
    char list[]={'A', 'B', 'C', 'D'};
    perm(list, 0, 4, print);
    return 0;
}

解释一下两个swap,比如上图,第三行第一个是由ABCD的BC交换得来的,排列完成后,ACBD通过交换变回ABCD,再进行ADBC的排列

猜你喜欢

转载自www.cnblogs.com/Vaxy/p/9721407.html