欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

全排列算法的原理和實現代碼

 更新時間:2014年08月28日 10:20:01   投稿:junjie  
這篇文章主要介紹了全排列算法的原理和實現代碼,全排列是將一組數按一定順序進行排列,如果這組數有n個,那么全排列數為n!個,需要的朋友可以參考下

全排列是將一組數按一定順序進行排列,如果這組數有n個,那么全排列數為n!個。現以{1, 2, 3, 4, 5}為例說明如何編寫全排列的遞歸算法。

1、首先看最后兩個數4, 5。 它們的全排列為4 5和5 4, 即以4開頭的5的全排列和以5開頭的4的全排列。

由于一個數的全排列就是其本身,從而得到以上結果。

2、再看后三個數3, 4, 5。它們的全排列為3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六組數。

即以3開頭的和4,5的全排列的組合、以4開頭的和3,5的全排列的組合和以5開頭的和3,4的全排列的組合.

從而可以推斷,設一組數p = {r1, r2, r3, ... ,rn}, 全排列為perm(p),pn = p - {rn}。

因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。當n = 1時perm(p} = r1。

為了更容易理解,將整組數中的所有的數分別與第一個數交換,這樣就總是在處理后n-1個數的全排列。

算法如下:

#include <stdio.h> 

int n = 0; 

void swap(int *a, int *b) 
{   
  int m;   
  m = *a;   
  *a = *b;   
  *b = m; 
} 
void perm(int list[], int k, int m) 
{   
  int i;   
  if(k > m)   
  {     
    for(i = 0; i <= m; i++)       
      printf("%d ", list[i]);     
    printf("\n");     
    n++;   
  }   
  else   
  {     
    for(i = k; i <= m; i++)     
    {       
      swap(&list[k], &list[i]);       
      perm(list, k + 1, m);       
      swap(&list[k], &list[i]);     
    }   
  } 
} 
int main() 
{   
  int list[] = {1, 2, 3, 4, 5};   
  perm(list, 0, 4);   
  printf("total:%d\n", n);   
  return 0; 
}

誰有更高效的遞歸和非遞歸算法,請回貼。

相關文章

  • VSCode插件開發(fā)全攻略之跳轉到定義、自動補全、懸停提示功能

    VSCode插件開發(fā)全攻略之跳轉到定義、自動補全、懸停提示功能

    這篇文章主要介紹了VSCode插件開發(fā)全攻略之跳轉到定義、自動補全、懸停提示,需要的朋友可以參考下
    2020-05-05
  • Microsoft Visual Studio 2022的安裝與使用詳細教程

    Microsoft Visual Studio 2022的安裝與使用詳細教程

    Microsoft Visual Studio 2022是Microsoft Visual Studio軟件的一個高版本,能夠編寫和執(zhí)行C/C++代碼,具有強大的功能,是開發(fā)C/C++程序的主流軟件,這篇文章主要介紹了Microsoft Visual Studio 2022的安裝與使用詳細教程
    2024-01-01
  • C++基于特征向量的KNN分類算法

    C++基于特征向量的KNN分類算法

    這篇文章主要為大家詳細介紹了C++基于特征向量的KNN分類算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C語言完整實現12種排序算法(小結)

    C語言完整實現12種排序算法(小結)

    本文主要介紹了C語言完整實現12種排序算法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C語言詳解鏈式隊列與循環(huán)隊列的實現

    C語言詳解鏈式隊列與循環(huán)隊列的實現

    隊列(Queue)與棧一樣,是一種線性存儲結構,它具有如下特點:隊列中的數據元素遵循“先進先出”(First In First Out)的原則,簡稱FIFO結構。在隊尾添加元素,在隊頭刪除元素,本篇來講解鏈式隊列與循環(huán)隊列的實現
    2022-04-04
  • Cocos2d-x中CCEditBox文本輸入框的使用實例

    Cocos2d-x中CCEditBox文本輸入框的使用實例

    這篇文章主要介紹了Cocos2d-x中CCEditBox文本輸入框的使用實例,本文在代碼中用大量注釋講解了CCEditBox的使用方法,需要的朋友可以參考下
    2014-09-09
  • 詳解C++語法中的虛繼承和虛基類

    詳解C++語法中的虛繼承和虛基類

    本文主要介紹了C++語法中的虛繼承和虛基類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • C語言中的文件讀寫fseek 函數

    C語言中的文件讀寫fseek 函數

    這篇文章主要介紹是我是C語言中的文件讀寫fseek 函數的相關資料,fseek 函數用來移動文件流的讀寫位置;就好比播放器,可以直接拖拽到精彩的時間點一樣,下面我們就來詳細介紹該內容吧,感興趣的小伙伴可以參考一下
    2021-10-10
  • C/C++?函數的存儲位置和占用空間詳解

    C/C++?函數的存儲位置和占用空間詳解

    Lambda函數的代碼部分在代碼段中,被捕獲的變量存儲在Lambda函數對象的內部,這些變量的存儲位置取決于Lambda函數對象的存儲位置,這篇文章主要介紹了C/C++函數的存儲位置和占用空間,需要的朋友可以參考下
    2023-06-06
  • C++ 成員變量的初始化順序問題詳解

    C++ 成員變量的初始化順序問題詳解

    這篇文章主要介紹了C++ 成員變量的初始化順序問題詳解的相關資料,需要的朋友可以參考下
    2017-02-02

最新評論