求n個數的全排列


求n個數的全排列

使用STL中的next_permutation函數、prev_permutation函數

這里先說兩個概念:“下一個排列組合”和“上一個排列組合”,對序列 {a, b, c},每一個元素都比后面的小,按照字典序列,固定a之后,a比bc都小,c比b大,它的下一個序列即為{a, c, b},而{a, c, b}的上一個序列即為{a, b, c},同理可以推出所有的六個序列為:{a, b, c}、{a, c, b}、{b, a, c}、{b, c, a}、{c, a, b}、{c, b, a},其中{a, b, c}沒有上一個元素,{c, b, a}沒有下一個元素。

next_permutation:求下一個排列組合 

a.函數模板:next_permutation(arr, arr+size);

b.參數說明:

  arr: 數組名

  size:數組元素個數

c.函數功能: 返回值為bool類型,當當前序列不存在下一個排列時,函數返回false,否則返回true,排列好的數在數組中存儲

d.注意:在使用前需要對欲排列數組按升序排序,否則只能找出該序列之后的全排列數。

    比如,如果數組num初始化為2,3,1,那么輸出就變為了:{2 3 1} {3 1 2} {3 2 1}

prev_permutation:求上一個排列組合

a.函數模板:prev_permutation(arr, arr+size);

b.參數說明

  arr: 數組名

  size:數組元素個數

c.函數功能: 返回值為bool類型,當當前序列不存在上一個排列時,函數返回false,否則返回true

d.注意:在使用前需要對欲排列數組按降序排序,否則只能找出該序列之后的全排列數。

代碼

//  /* C++ STL 全排列函數詳解   https://www.cnblogs.com/aiguona/p/7304945.html*/
#include <iostream>
#include <algorithm>
using namespace std;
int main ()
{
    int arr[] = {3,2,1};
    cout<<"用prev_permutation對3 2 1的全排列"<<endl;
    do
    {
        cout << arr[0] << ' ' << arr[1] << ' ' << arr[2]<<'\n';
    }
    while ( prev_permutation(arr,arr+3) );      ///獲取上一個較大字典序排列,如果3改為2,只對前兩個數全排列
 
    int arr1[] = {1,2,3};
    cout<<"用next_permutation對1 2 3的全排列"<<endl;
    do
    {
        cout << arr1[0] << ' ' << arr1[1] << ' ' << arr1[2] <<'\n';
    }
    while ( next_permutation(arr1,arr1+3) );      ///獲取下一個較大字典序排列,如果3改為2,只對前兩個數全排列
    ///注意數組順序,必要時要對數組先進行排序
 
    return 0;
}

 

參考:

https://blog.csdn.net/KYJL888/article/details/85069557

 


免責聲明!

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



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