全排列的詳細解析


好久沒有更新了,今天來更新一下。
今天來說一下關於全排列的問題
那么第一個問題,什么是全排列?
全排列可以理解為,數學里面的排列組合
更簡單的說呢,就是,從一到n這n個數有多少種排列情況?
當然,答案顯而易見,就是:  n的階乘當然,n的階乘肯定不是今天要討論的東西

 

今天我們要討論的就是如何把這n的階乘種情況給表示出來
那么下面我們切入正題開始分析如何生成全排列?
我們先看第一位的情況,他有n個數,從一到n那么開頭的情況肯定是n種,123直到n
當然,因為開頭是1,所以一的時候就不用多說,對吧?
然后下面就要分出2開頭,3開頭到n開頭的情況,對吧?那么怎么生成這種情況呢?就是拿1和2和3和4到n依次換位(1開頭可以理解為1和自己交換)
這樣第一位的情況就考慮完了,對吧?下面我們考慮第二位,第二位其實也是這樣,考慮第二位自己不變,第二位和后面的換和(后面的后面)的換....
更直接的說就是第一位已經確定假設是1,后面還有n-1個數,第二位可能是2,可能是3,可能是....n,那么久,等同於拿2和自己換位和3換位和4換位到和n換位
那么,我這樣往下分析下去,直到就是說第n-1位和第一個n位換位。下面就沒有分叉了  
意思就是說我們要在,第一位不換位的情況下去考慮,用第二位和自己換位和第三位和第四位,直到第n位,這些情況,然后再這些情況的每一種情況下再去考慮分叉出的情況,依次往下,直到考慮到第n-1位和,第n位換位
因為每一種情況下面都會分出各種情況,而各種情況之后,又會分出各種情況,那么,我們再具體說些細節問題

也就是說,考慮到某一種情況,一直往下延伸,直到無法往下延伸的某一種情況的時候,也就是說,對n-1為和dn位換位之后,此時我們會生成一個新的排列,這就是全排列中的一種情況,由於我們生成此排列的時候,對dny和an-1為進行了換位,由於我們要保證生成其他排列時,他們的順序和本序列生成所面對的序列情況相同,我們輸出這個新的排列,也就是剛才我們所說的一個排列突出之后呢,我們要把它換回來,這里稱之為,回朔

這樣才能保證全排列的

OK    

下面我們來看代碼

這里用Java來編碼

import java.util.Scanner;

public class Permutation {


  public static int count = 0;

  public static void main(String[] argv) {

    Scanner in =new Scanner(System.in);
    int N = in.nextInt();//輸入N   這里用於輸出1到N的全排列
    int[] key = new int[N];
    for(int i=0;i<key.length;i++){
      key[i]=i+1;
    }
    check(0,key,N);
  }
  public static void check(int n,int[] a,int N){//換位函數
    int i;
    if(n==N){//符合條件輸出
      Put(a);
    }
    for(i=n;i<N;i++){
      int x=a[n];
      a[n]=a[i];
      a[i]=x;
      check(n+1,a,N);//考慮下面分叉
      x=a[n];
      a[n]=a[i];//回溯
      a[i]=x;
    }
  }
  public static void Put(int[] a){//輸出函數
    int i;
    for (i=0;i<a.length;i++){
      System.out.print(a[i]+" ");
    }
    System.out.println();
  }
}

上面就是代碼

下面我們看示例輸出

 

 

 

太大的數呢

輸出太長

就不展示了

主要是理解這個思路

因為很多算法題明里暗里都會用到全排列的計算

OK   這次更新就到這

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM