用VC编程:求给定n个数的所有不同排列

来源:百度知道 编辑:UC知道 时间:2024/05/26 16:39:04
设法写一个程序,对于给定整数n,它能输出1到n之间的数的所有不同排列。如给定n=3,输出123 132 213 231 312 321。

// Permutation.cpp : 定义控制台应用程序的入口点。
//
//N个数全排列的非递归算法

#include<iostream>
using namespace std;

void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}

/*
根据当前的排列p,计算下一个排列。
原则是从1234-->4321,若p已经是最后一个排列,传回false,否则传回true。
p是一个n维向量。
*/
bool nextPermutation(int *p, int n)
{
int last = n - 1;
int i, j, k;

//从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。
i = last;
while (i > 0 && p[i] < p[i - 1])
i--;
//若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回false。
if (i == 0)
return false;

//从后查到i,查找大于p[i - 1]的最小的数,记入k
k = i;
for (j = last; j >= i; j--)
if (p[j] > p[i - 1] && p[j] < p[k])
k = j;
//交换p[k]和p[i - 1]
swap(p[k], p[i - 1]);
//倒置p[last]到p[i]
for (j = last, k = i; j