N个数全排列的非递归算法
来源:互联网 发布:宝山区行知外国语小学 编辑:程序博客网 时间:2024/06/10 03:09
- //N个数全排列的非递归算法
- #include"stdio.h"
- 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>k;j--,k++)
- swap(p[j],p[k]);
- return true;
- }
- //显示一个排列
- void showPermutation(int *p, int n)
- {
- for(int i=0;i<n;i++)
- printf("%d ",p[i]);
- printf("\n");
- }
- int main(int argc, char *argv[])
- {
- int n;
- int *p;
- scanf("%d",&n);
- p = new int[n];
- for (int i = 0; i < n; i++)
- p[i] = i + 1;
- showPermutation(p, n);
- while(nextPermutation(p, n))
- {
- showPermutation(p, n);
- }
- //delete[] p;
- return 0;
- }
本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/702551
0 0
- N个数全排列的非递归算法
- N个数取m个数的全排列非递归
- n个数全排列的非递归生成算法,C实现
- 普通递归算法:输出n个数的所有全排列
- 全排列的非递归算法
- 全排列的非递归算法
- 全排列算法的非递归实现
- n的全排列递归算法
- n的全排列递归算法
- 数据结构_递归算法的应用_打印n个数的全排列数
- 蓝桥杯常用算法知识点:【递归】m个A与n个B的全排列个数
- 全排列非递归算法
- 打印n个数的全排列(递归版)
- 非递归的输出1-N的全排列
- N个字符全排列的非递归实现
- 全排列算法的递归与非递归实现
- 全排列算法的递归与非递归实现
- 关于全排列的递归和非递归算法
- C语言计算任意数的任意次方
- 判断QQ是否在线
- Netbeans连接数据库
- 网页动态显示时间
- C语言时间函数
- N个数全排列的非递归算法
- 百度之星--------图标排列
- UVA - 10239 The Book-shelver's Problem
- jsp登录验证代码
- 总结JSP与servlet之间的传值
- java date时间相关处理
- excel批量导入数据到数据库
- javascript时间
- SQL触发器