全排列问题(递归&非递归&STL函数)
问题描述:
打印输出1-9的所有全排序列,或者打印输出a-d的全排列。
思路分析:
将每个元素放到余下n-1个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去。
比如:1 2 3 为例
首先将1放到最前方(跟第1个元素交换),然后后面2位再做全排,然后将1放回本来位置
结果 1 2 3; 1 3 2
其次将2放到最前方(跟第1个元素交换),然后后面2位再做全排,然后将2放回原处
结果 2 1 3; 2 3 1
。。。。。
C/C++递归实现:
#include<cstdio>
#include<iostream>
using namespace std; void swap(int list[], int i, int j) //交换list中i和j位置的元素
{
int temp = list[i];
list[i] = list[j];
list[j] = temp;
} void fun(int list[], int m, int n) //输出list中m到n的全排列
{
if(m==n)
{
for(int i=; i<n; i++) //输出0-n的一个排列
{
printf("%d",list[i]);
}
printf("\n");
}
else
{
for(int i=m; i<n; i++)
{
swap(list,m,i); //把第i个和第一个(此时是m)交换
fun(list,m+,n); //余下的继续递归
swap(list,m,i); //将第i个放回原处
}
}
} int main()
{
int list[] = {,,,,,};
int length = sizeof(list)/sizeof(list[]);
fun(list,,length);
return ;
}
C/C++非递归实现:(当输入中数字有重复数字时仍能正常工作,即不会有重复输出)
/*完全参考:http://blog.csdn.net/prstaxy/article/details/8147029*/ #include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool next(vector<int> &v)//注意是引用
{
int i;
for(i=v.size()-;i>=;i--)
{//从数组后面往前找到第一个比后面的数小的地方
if(v[i-]<v[i])
break;
}
if(i==)//整个数组都是逆序,说明是已是排列最后一个
return false;//没有下一个
else
{
int t=v[i-],pos=i;
for(int j=i;j<v.size();j++)
{
if(v[j]>t && v[j]<=v[pos])//再往后找比v[i-1]大的数中最小的一个 //2014.10.1把<改成<=,否则输入有重复数字时会出现bug
pos=j;
}
v[i-]=v[pos];
v[pos]=t;//交换
//sort(v.begin()+i,v.end());//从小到达排序
reverse(v.begin()+i,v.end());//此时正好逆序,只需反转即可从小到达排序
return true;//还有下一个
}
}
void printVctor(vector<int> v)
{
for(int i=;i<v.size();++i)
cout<<v[i]<<" ";
cout<<endl;
}
int main()
{
int a[] = {,,,,};
vector<int> v(a,a+);
do
{
printVctor(v);
}while(next(v));
return ;
}
非递归实现
C++ STL代码实现:
C++ STL中算法库中包含了计算排列组合关系的算法next_permutation、prev_permutation,用法如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std; int main()
{
int list[] = {,,,,,};
int length = sizeof(list)/sizeof(list[]);
sort(list, list+length); /* 这个sort可以不用,因为{1,2,3,4}已经排好序*/
do /*注意这步,如果是while循环,则需要提前输出第一个次序*/
{
for(int i=; i<length; i++)
{
printf("%d",list[i]);
}
printf("\n");
}while(next_permutation(list,list+length));
//while(prev_permutation(list,list+length));//求上一个排列数,初始数组用逆序来调用可以输出全排列
return ;
}
参考链接:
next_permutation(全排列算法) http://blog.csdn.net/c18219227162/article/details/50301513
上面这个链接开始介绍了排列组合是如何区分前一个后一个的,也就是如何排序的; 最后还包含一个 “直接算出集合{1, 2, ..., m}的第n个排列” 的代码实现
http://blog.csdn.net/prstaxy/article/details/8147029
http://blog.csdn.net/knisinf/article/details/48048011
全排列问题(递归&非递归&STL函数)的更多相关文章
- Reverse Linked List 递归非递归实现
单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
- 二叉树的先序、中序以及后序遍历(递归 && 非递归)
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...
- 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)
在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...
- java:合并两个排序的链表(递归+非递归)
//采用不带头结点的链表 非递归实现 public static ListNode merge(ListNode list1,ListNode list2){ if(list1==null) retu ...
- 二叉树的递归,非递归遍历(java)
import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private ...
- 二叉树的递归,非递归遍历(C++)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)
递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...
随机推荐
- 20155204 2016-2017-2 《Java程序设计》第6周学习总结
20155204 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 一切皆对象,输入输出也是类,线程也是 String对象的trim方法去掉首尾空格和空字符 f ...
- JavaScript之从浏览器一键获取教务处个人课程信息【插件】
由于博主的个人网站(:http://www.johnnyzen.cn/),每学期都需要更新呈现课程的静态信息,由于课程量多,而且手动爬取很冗杂,特别想自动化实现.这不,今天终于有点时间了,把之前写no ...
- <video>标签:视频播放器动态设置src
HTML代码 <div id="my_div"> <video id="my_video" width="600" ...
- Adjoint of SE(3)
以前看的书都提到 SE(3) 和 se(3) 的 Adjoint,但是并没有讲这个东西是干什么用的,只是给了一堆性质.这东西来自群论. 参考 Lie Groups for 2D and 3D Tran ...
- 用代码生成UINavigationController 与UITabBarController相结合的简单QQ框架(部分)
首先我们需要搭建一个空的项目,当然xcode6.0以后不支持直接创建空项目,所以我们需要在系统生成项目之后,删除xcode自动给你生成的控制器和storyboard,另外需要在Main Interfa ...
- linux挂载硬盘以及卸载硬盘
1.在vmware添加硬盘 2.输入fdisk -l 查看新增加的硬盘 3.分区初始化 4.指定文件系统 5.修改fstab文件 fstab: 6.刷新验证 mount -a 挂载定义在/etc/fs ...
- 【转】Python之日期与时间处理模块(date和datetime)
[转]Python之日期与时间处理模块(date和datetime) 本节内容 前言 相关术语的解释 时间的表现形式 time模块 datetime模块 时间格式码 总结 前言 在开发工作中,我们经常 ...
- db_recovery_file_dest_size
select name,space_limit,space_used,number_of_files from v$recovery_file_dest; alter system set db_re ...
- 通达OA批量处理没有结束但前台显示已经结束的流程
问题描述: 通达OA系统出现大量流程没有结束,系统显示结束的问题 通过查询操作系统日志,数据库日志,包括程序日志没有发现异常,通过观察发现大量的流程结束时间都是在2016-02-16 17:32:XX ...
- Android数据存储:File
Android数据存储之File Files:它通过FileInputStream和FileOuputStream对文件进行操作.但是在Android中,文件是一个应用程序私有的,一个应用程序无法读写 ...