#include <iostream>
using namespace std;
//判断是否有上一个排列,判断依据为ai < ai-1
bool has_prev_permute(int a[], int n)
{
for(int i = n - 1; i >= 1; i--)
if(a[i - 1] > a[i] )
return true;
return false;
}
//判断是否有下一个排列,判断依据为ai > ai-1
bool has_next_permute(int a[], int n)
{
for(int i = n - 1; i >= 1; i--)
if(a[i - 1] < a[i] )
return true;
return false;
}
//下一个排列
void next_permute(int a[], int n)
{
int i = n - 1;
for(i = n - 2; i >= 0; i--)
if(a[i + 1] > a[i])
break;
if(i == -1)
return;
for(int j = n - 1; j >= 0; j--)
if(a[j] > a[i])
{
int temp = a[j];
a[j] = a[i];
a[i] = temp;
break;
}
for(int j = i + 1, k = n - 1; j < k; j ++, k--)
{
int temp = a[j];
a[j] = a[k];
a[k] = temp;
}
}
void prev_permute(int a[], int n)
{
int i = n - 1;
for(i = n - 2; i >= 0; i--)
if(a[i + 1] < a[i])
break;
if(i == -1)
return;
for(int j = n - 1; j >= 0; j--)
if(a[j] < a[i])
{
int temp = a[j];
a[j] = a[i];
a[i] = temp;
break;
}
for(int j = i + 1, k = n - 1; j < k; j ++, k--)
{
int temp = a[j];
a[j] = a[k];
a[k] = temp;
}
}
void print(int a[], int n)
{
for(int i = 0; i < n; i++)
cout << a[i] <<" ";
cout << endl;
}
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
//所有的排列则为(r1)R1 (r2)R2 ... (rn)R3
//其中r1...rn不重复
void permute(int a[], int k, int n)
{
if(k == n)
{
print(a, n);
return;
}
bool flag = false;
for(int i = k; i < n; i++)
{
flag = false;
//如果遇到重复的元素,则不交换
for(int j = k; j < i; j++)
{
if(a[i] == a[j])
{
flag = true;
break;
}
}
if(flag)
continue;
swap(a[k], a[i]);
permute(a, k + 1, n);
swap(a[k], a[i]);
}
}
int main()
{
int a[] = {1,2,2};
int i = 1;
permute(a, 0, 3);
return 0;
}
排列的基本算法
最新推荐文章于 2019-04-20 20:41:00 发布