1、全排列:
(1)遞迴實現:
void myFullSort(vector<int> data, int k, int end){int i;if (k == end){for (i = 0; i <= end; i++){cout << data[i] << " ";}cout << endl;}else{for (i = k; i <= end; i++){std::swap(data[k], data[i]);myFullSort(data, k + 1, end);std::swap(data[k], data[i]);}}}
(2)非遞迴實現:
(3)運用STL中的函數next_permutation( ):
#include <iostream> #include <algorithm> #include <vector>using namespace std;//STL —— next_permutation()void permutation(vector<int> array, int len){sort(array.begin(), array.end()); //必須首先對未經處理資料進行排序,否則無法得到全部的全排列()do{for (int i = 0; i < len; ++i){cout << array[i] << " ";}cout << endl;} while (next_permutation(array.begin(), array.end())); //next_permutation是根據數字大小在找下一個排列}int main(){vector<int> a = { 3, 2, 1, 4 };permutation(a, a.size());return 0;}
(4)如果資料中有重複數字,則需要剔除重複的全排列序列:
bool IsSwap(vector<int>& pszStr, int nBegin, int nEnd){for (int i = nBegin; i < nEnd; i++){if (pszStr[i] == pszStr[nEnd])return false;}return true;}void myFullSort(vector<int> data, int k, int end){int i;if (k == end){for (i = 0; i <= end; i++){cout << data[i] << " ";}cout << endl;}else{for (i = k; i <= end; i++){if (IsSwap(data, k, i)){std::swap(data[k], data[i]);myFullSort(data, k + 1, end);std::swap(data[k], data[i]);}}}}
2、判斷棧序:
bool isPopsort(vector<int> Push, vector<int> Pop){size_t size1 = Push.size();size_t size2 = Pop.size();if (size1 == 0 || size2 == 0)return false;stack<int> tmp; //輔助棧for (size_t i = 0, j = 0; i < size1; i++){tmp.push(Push[i]);//如果不是出棧序列元素,就一直壓棧 while (j < size2 && !tmp.empty() && Pop[j] == tmp.top()) //開始判斷{tmp.pop();j++;}}return tmp.empty();}
3、火車進出站:(上面兩者的組合)
#include <iostream>#include <vector>#include <stack>using namespace std;vector<int> input;bool isPopsort1(vector<int> Push, vector<int> Pop){size_t size1 = Push.size();size_t size2 = Pop.size();if (size1 == 0 || size2 == 0)return false;stack<int> tmp; //輔助棧for (size_t i = 0, j = 0; i < size1; i++){tmp.push(Push[i]);//如果不是出棧序列元素,就一直壓棧while (j < size2 && !tmp.empty() && Pop[j] == tmp.top()) //開始判斷{tmp.pop();j++;}}return tmp.empty();}void myFullSort1(vector<int> data, int k, int end){int i;if (k > end){if (isPopsort1(input, data)) //全排列必須是棧序,才可以輸出{for (i = 0; i <= end; i++){cout << data[i] << " ";}cout << endl;}}else{for (i = k; i <= end; i++){std::swap(data[k], data[i]);myFullSort1(data, k + 1, end);std::swap(data[k], data[i]);}}}int main(){int N;cin >> N;for (int i = 0; i < N; i++){int tmp;cin >> tmp;input.push_back(tmp);}myFullSort1(input, 0, N - 1);return 0;}