全排列问题(递归&非递归&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 ...
随机推荐
- Java SE之反射技术[Class](三)
/** * * @author Zen Johnny * */ package com.cpms.test; import java.lang.reflect.Field; import java.u ...
- SpringMVC 使用@ResponseBody返回json 中文乱码与返回实体类报错
有时候我们发现接收的是中文,返回却是个?.这确实是个蛋疼的问题,Spring中解析字符串的转换器默认编码居然是ISO-8859-1 /** * Implementation of {@link Htt ...
- Freemarker导出带多个不重复图片的word
1.新建一个word,添加一张图片,调整好图片大小与位置.
- vlc-android 的编译过程
参考官方文档:https://wiki.videolan.org/AndroidCompile#Get_VLC_Source 值得注意的的地方: 1.切记安装以下工具 sudo apt-get ins ...
- Linux内存管理--物理内存分配【转】
转自:http://blog.csdn.net/myarrow/article/details/8682819 1. First Fit分配器 First Fit分配器是最基本的内存分配器,它使用bi ...
- 字符串cookies转字典 scrapy使用。
配置文件 DOWNLOADER_MIDDLEWARES = { 'weibo.middlewares.CookiesMiddleware': 543, } 中间件内容 class CookiesMid ...
- nodejs的 new String
已知rwo4的记录中baitaiid是001// row4为jhlist开始循环结果 for(var i=0;i<row4.length;i++) { var baiTaiId=new Stri ...
- WebsphereMQ搭建集群
#https://www.ibm.com/developerworks/cn/websphere/library/techarticles/1202_gaoly_mq/1202_gaoly_mq.ht ...
- 配置samba文件服务器
1.打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码"--> ...
- oracle 回退表空间清理
1.查看已有表空间,找到回退表空间 SELECT * FROM DBA_TABLESPACES WHERE CONTENTS='UNDO' 2.创建新的回退表空间 create undo tables ...