【C++】Perm递归全排列函数分析

来源:互联网 发布:js数组按下标删除元素 编辑:程序博客网 时间:2024/05/21 21:39

程序源码:

#include<stdio.h>#include<Windows.h>#include<iostream>using namespace std;void Perm(int* array, int size, int N) {     if(N == size) {         for(int i = 0; i < size; ++i){            cout<<array[i]   ;        }        cout<<endl;    }     else     {         for(int i = N; i < size; ++i){            swap(array[i], array[N]);            Perm(array, size, N+1);            swap(array[i], array[N]);        }     } } int main(){    int arr[5]={1,2,3,4,5};    Perm(arr,5,3);    system("pause");    return 0;}

程序运行结果:

这里写图片描述

【程序分析】:

  从下图的分析中我们可以看出,Perm函数的功能是将传递过来的数组的后size - N 位进行全排列,将排列的每一组数都输出。

第一次循环:

这里写图片描述

第二次循环:

这里写图片描述

【例】:对数组的后三位进行全排列。主函数如下所示:

int main(){    int arr[6]={1,2,3,4,5,6};    Perm(arr,6,3);    system("pause");    return 0;}

【结果】:

这里写图片描述

结论:

【时间复杂度】:O(n!)
Perm函数是一个递归函数,它的作用是对数组的后size-N 位进行全排列,缺点是时间复杂度高。