#include#include#include#include#include#include#include#includeusing namespace std;
const int max_size = 1000;
/*尋找下乙個排列
假設 某個序列為 d1 d2 d3 ... dn
那麼在dn前找第乙個 比dn小的元素 那麼序列被分為兩段 假設為di
d1 d2 d3 ... di ... dn 我們只分析 di-dn 因為前邊不會影響結果
那麼我們可以肯定的是 d(i+1)-d(n)一定是 乙個最大字典序 即按字典排序的遞減序列
繼而 dn為該序列中最小元素 將di與dn交換(因為從d(i+1)-dn已經沒有下乙個排列了)
現在得到的新序列 d(i') d(i+1) ... d(n') 那麼我們是否可以保證這個序列就是下乙個序列呢?
答案是不能 因為此時d(i+1)-d(n')也是乙個最大字典序列(d(n')最小)。所以將(i+1)-n
逆序便會使之變為最小 最後得到下乙個排列。這其中有進製的思想。
當這個序列不存在這樣的逆序對時,說明不存在下乙個序列。
這個思想和stl中的思想相似 但是stl中找的是相鄰元素在有重複元素存在時 就會找出重複的排列
*/templatevoid display(const vector& vec)
template//類模板預設引數
class compare :public binary_function
} compare(const char op = '
private:
char m_op;
};//當然我們完全可以 不使用函式物件 直接傳遞乙個引數(但是我們是想辦法不讓函式去做判斷
//而是讓外部去判斷,那樣需要修改時直接修改這個元件物件便可,傳入less() 或者greater()也是可以的。)
templatebool getpermutation(vector& vec, const comparecom)
int first = 0;
int last = vec.size() - 1;
int prev = last;
int next = last;
--prev;
while (first != next)
--next;
} --prev;
} return false;
}int main(void)
; display(vec);
//可以先進行排序 不想排序就需要呼叫兩個函式
while (getpermutation(vec, compare('
return 0;
}
非遞迴實現全排列
要求 使用非遞迴的方法按照字典序輸出全排列 思路 這次以 1 5 4 3 2 為例,下乙個排列是 2 1 3 4 5 從後往前找,找到第乙個連續遞增的兩個數字,找到了 1 5 重新從後往前找,找到第乙個大於 1 的數字,找到了 2 1 就是步驟三中找到的第乙個數字 找到 2 之後,將 1 和 2 互...
全排列 遞迴與非遞迴實現
全排列問題在公司筆試的時候非經常見,這裡介紹其遞迴與非遞迴實現。簡單地說 就是第乙個數分別以後面的數進行交換 e.g e a b c 則 prem e a.perm b,c b.perm a,c c.perm a,b 然後a.perm b,c ab.perm c ac.perm b abc acb....
全排列的非遞迴實現
以前寫過全排列的遞迴演算法,思路和實現都比較簡單。上週練習python,遇到了全排列的問題,就想著用非遞迴實現實現以下。沒想到從中午想到了半夜,草稿用了好幾張,也沒想到好的idea。第二天早上在地鐵上,在手機撥號頁面演示了一會,竟然有了思路。假定 從小打大排序,稱為正序,反之稱為逆序,我的思路是 以...