#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
void NextPermutation(int num[], int n);
};
void Solution::NextPermutation(int num[], int n)
{
<span style="white-space:pre"> </span>int change = -1;
<span style="white-space:pre"> </span>int tmp;
<span style="white-space:pre"> </span>int i;
<span style="white-space:pre"> </span>i = n-1;
<span style="white-space:pre"> </span>//找到第一个不是升序的点,从后边往前遍历
<span style="white-space:pre"> </span>while(i!=0 && num[i-1]>=num[i])
<span style="white-space:pre"> </span>i--;
<span style="white-space:pre"> </span>if( i == 0 )
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>//直接反转顺序
<span style="white-space:pre"> </span>for(i=0; i<(n-1)/2; i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>tmp = num[i];
<span style="white-space:pre"> </span>num[i] = num[n-1-i];
<span style="white-space:pre"> </span>num[n-1-i] = tmp;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>change = i-1;
<span style="white-space:pre"> </span>for(i=n-1; i>change; i--)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if(num[i]>num[change])
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>tmp = num[i];
<span style="white-space:pre"> </span>num[i] = num[change];
<span style="white-space:pre"> </span>num[change] = tmp;
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//反转顺序
<span style="white-space:pre"> </span>for(i=0; i<(n-1-change)/2; i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>tmp = num[change+1+i];
<span style="white-space:pre"> </span>num[change+1+i] = num[n-1-i];
<span style="white-space:pre"> </span>num[n-1-i] = tmp;
<span style="white-space:pre"> </span>}
}
int main()
{
Solution s;
int array[4] = {1,2,2,4};
vector<int> array2;
array2.push_back(1);
array2.push_back(2);
array2.push_back(2);
array2.push_back(4);
for(int j=0; j<24-1; j++)
{
s.NextPermutation(array, 4);
for(int i=0; i<4; i++)
cout<<array[i]<<" ";
cout<<"\t";
//标准stl输出
next_permutation(array2.begin(), array2.end());
for(vector<int>::iterator it = array2.begin(); it!=array2.end(); it++)
cout<<*it<<" ";
cout<<endl;
}
}
算法复杂度是O(n),空间复杂度是O(1)。