求全排列 可重複 next permutation

2021-06-10 09:31:28 字數 808 閱讀 4563

字典序列演算法

字典序列演算法是一種非遞迴演算法。而它正是stl中next_permutation的實現演算法。我們來看看他的思路吧:

它的整體思想是讓排列成為可遞推的數列,也就是說從前一狀態的排列,可以推出一種新的狀態,直到最終狀態。比如說,最初狀態是12345,最終狀態是54321。其實我覺得這跟我們手動做全排列是一樣的。首先是12345,然後12354,然後12435,12453....逐漸地從後往前遞增。

演算法描述:

首先,將待排序列變成有序(公升序)序列。然後,從後向前尋找,找到相鄰的兩個元素,titi(很多時候k=j),找到它,交換ti跟tk,並且將tj到tn(tn是最後乙個元素)的子串行進行倒置操作。輸出此序列。

#include #include #include typedef enum  bool;

void swap(char* a,char*b)

}void reserve(char*first,char*last)

}//下乙個排列,有重複的字元也可。

//演算法:從右到左找到第乙個 a[i]// 在從右到左找到第乙個a[i]//交換a[i] a[j],然後倒置[i+1,last)這個區間,ok

bool next_permutation(char *first,char *last)

if(left == first)

}}int main(void) while(next_permutation(s,s+strlen(s)));

return 0;

}

遞迴求全排列

取出陣列中第乙個元素放到最後,即a 1 與a n 交換,然後遞迴求a n 1 的全排列 1 如果陣列只有乙個元素n 1,a 則全排列就是 2 如果陣列有兩個元素n 2,a 則全排列是 a 1 與a 2 交換。交換後求a 2 1 的全排列,歸結到1 a 2 與a 2 交換。交換後求a 2 1 的全排列...

全排列(可排除重複)

首先我們來說一下這個問題的基本演算法,其實很簡單,是乙個典型的遞迴演算法 1.abbc 排序 讓相等的字元連續 2.a bbc 求解以第乙個字元開頭的組合 3.b abc 發現第二個字元b和上一組組合的頭a 不相等,所以調換,並求解一新頭 b 開頭的組合 4.abbc 還原上一次的交換 5.abbc...

庫函式求全排列

上級排列 prev permutation start,end 求的是當前排列的上乙個排列 對於 上乙個 和 下乙個 它們為字典序的前後,就是對於當前序列pn,他的下乙個序列pn 1,不存在另外的pm,使得pn字典序 不同排列的先後關係是從左 右逐個比較對應的數字的先後來決定的。例如 對於6個數字的...