非遞迴全排列實現

2021-07-11 01:18:00 字數 1423 閱讀 5164

#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。第二天早上在地鐵上,在手機撥號頁面演示了一會,竟然有了思路。假定 從小打大排序,稱為正序,反之稱為逆序,我的思路是 以...