全排列问题(递归&非递归&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 ...
随机推荐
- 虚拟机centos7系统下安装hadoop ha和yarn ha(详细)
一:基础环境准备 (一):虚拟机新建五个centos7系统(复制文件夹的方式) (二):角色分配 (三)按照角色分配表配置 (1)更改主机ip(自行查找),如果只是个人搭建玩一玩,可选择安装cento ...
- luogu P1070 道路游戏
传送门 这里设\(f_i\)表示时刻\(i\)的答案 转移的话在\([i-p+1,i-1]\)之间枚举j,然后考虑从哪个点走过来 复杂度为\(O(n^3)\) // luogu-judger-enab ...
- python cookbook 笔记一
因为有些代码只有在python3里可以正常运行,所以最好配两个虚拟环境 安装虚拟环境: pip install virtualenv virtualenv -p /usr/bin/python3.5 ...
- MoveIt! 源安装
rosdep update sudo apt-get update sudo apt-get dist-upgrade sudo apt-get install python-wstool pytho ...
- Latex 算法Algorithm
在计算机科学当中,论文当中经常需要排版算法.相信大家在读论文中也看见了很多排版精美的算法.本文就通过示例来简要介绍一下 algorithms 束的用法.该束主要提供了两个宏包,包含两种进行算法排版的环 ...
- LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇
题目传送门:LOJ #2249. 题意简述: 有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数, ...
- 集群下Dubbo负载均衡配置
在集群负载均衡时,Dubbo提供了4种均衡策略,默认为Random(随机调用) 负载均衡策略: 1).Random LoadBalance(随机,按照权重的设置随机概率) 2).RoundRobin ...
- WPF复制异常问题(OpenClipboard 失败 (异常来自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)))
最近在维护WPF系统的时候发现的问题,刚刚开始自己的电脑都不能重现,后面写日志跟踪才发现问题的所在.问题主要是由于:1. 在程序访问剪切板的时候,有其他程序正在占用剪切板,导致自己的程序无法访问, ...
- C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)
多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函 ...
- CONFIG_DEBUG_USER【转】
转自:https://blog.csdn.net/adaptiver/article/details/12778621 关于CONFIG_DEBUG_USER 把menuconfig中查到的 CONF ...