zoukankan      html  css  js  c++  java
  • C--全排列的实现(递归方法) 傻子也能看懂的

     

    假设数组含有n个元素,则提取数组中的每一个元素做一次头元素,然后全排列除数组中除第一个元素之外的所有元素,这样就达到了对数组中所有元素进行全排列的得目的。【这句话才是重点!】

    比如 1,2,3.的全排列就是分别以1,2,3开始的全排列。

                以1开始的全排列也就是2,3.的全排列,(2,3)的全排列就是分别以2和3开始的全排列。

    设全排列R(n1,n2,n3.....nn),可以化简为分别以n1,n2,n3……开始的全排列。

    即   n1R1(n2,n3.....nn),n2R2(n1,n3.....nn),n3R3(n1,n2,.....nn)……nnR(n1,n2,n3.....)

    其中,R1(n2,n3.....nn)又可以按照R的方式继续进行……以此类推可以得到全排列。

    #include<iostream>
    
    using namespace std;
    
    
    //index,代表递归过程中,子数列在原始数列中的位置
    //例如 a[] = {1,2,3},原始数列长度LENGTH = 3,
    //递归到其中某一步时index = 1,num= 2,代表要从原始数列的下表为1处,长度为2(即自数列2,3)开始,查找子数列
    //(2,3)的全排列
    
    //LENGTH 为原始数组的长度,这个是不会变的。
    void permutation(int values[], int index, int num,int LENGTH)
    {
     int i = 0;
     if(num == 0)//已经找到一个全排列,显示输出
     {
      for(i=0; i<LENGTH;++i)
      {
       cout<<values[i]<<" ";
      }
      cout<<endl;
    
      return;
     }
     for(i=0; i<num; i++)
     {
      swap(values[index+i], values[index]);//第index个整数和第index+i个数字交换,保证自数列的第一个元素与该子数列中每一个元素进行一次交换,进行排列。
    permutation(values, index+1, num-1);//对从index+1到数组最末端的元素进行全排列
    swap(values[index], values[index+i]);//for循环中第一条语句的逆操作,其目的是使数组倒回原来的样子,
    //这样做的目的是使排列不会产生重复的结果。 } return; } int main() { int values[]={1,3,5}; permutation(values,0,3,3); cout<<endl<<endl; for(int i=0;i<3;++i) { cout<<values[i]<<' '; } cout<<endl<<endl; return 0; }
  • 相关阅读:
    css3
    css3
    npm 安装包无法继续下载? 卡住
    tcp/ip协议中的SYN, ACK的数值变化
    【转】6 Reasons Why JavaScript’s Async/Await Blows Promises Away (Tutorial)
    ES6 中 Symbol.split的用法
    Why does Typescript use the keyword “export” to make classes and interfaces public?
    es6中的import,export浏览器已经支持
    Understanding the JavaScript Engine—— two phase
    【转】js-ES6学习笔记-Symbol
  • 原文地址:https://www.cnblogs.com/plxx/p/3601329.html
Copyright © 2011-2022 走看看