全排序递归算法

给定n(n>=1)个元素的集合,输出该集合的所有可能的排列。

如abc的全排列的个数为3!=6个

分别为:abc,  acb              a开头的bc全排列

    bac,     bca        b开头的ac全排列

    cba,  cab        c开头的ba全排列

递归的线索是后面跟着...的全排列,也就是n个元素的排列问题可以转化为n-1个元素的排列问题

代码如下:

 1 /*
 2 递归是从前往后执行,结果从后往前回溯
 3     abcd的全排列为 1次
 4                    a bcd的全排列  a和a换位置之后  转化为求bcd的全排列    求完排列后需要换回来保证初始字符串不变
 5                    b acd的全排列  a和b换位置之后  转化为求acd的全排列    求完排列后需要换回来保证初始字符串不变
 6                    c bad的全排列  a和c换位置之后  转化为求bad的全排列    求完排列后需要换回来保证初始字符串不变
 7                    d bca的全排列  a和d换位置之后  转化为求bca的全排列    求完排列后需要换回来保证初始字符串不变
 8     结束条件:当只剩最后一个字母时,他的全排列就是他自己
 9 */
10
11 #include<stdio.h>
12 #define  SWAP(x,y,t)   ((t=x),(x)=(y),(y)=(t))
13 void perm(char *list,int i,int n);
14 int main()
15 {
16     char a[5]="abcd";
17     perm(a,0,3);
18     printf("%s",a);
19     return 0;
20  }
21
22 void perm(char *list,int i,int n)
23 {
24     int j,temp;
25     if(i == n){                        //当i是最后一个元素时递归结束
26         for( j = 0; j <= n; j++ )
27             printf("%c",list[j]);
28         printf("\n——————\n");
29     }
30     else{
31         for( j = i ; j <= n ; j++ ){ //求i到n的全排列
32             SWAP(list[i],list[j],temp);//以每一个元素为开始的全排列
33             perm(list,i+1,n);        //求i+1到n的全排列
34             SWAP(list[i],list[j],temp);//保证初始数组不变
35         }
36     }
37  }
38
39
40  
时间: 2024-10-22 03:30:39

全排序递归算法的相关文章

全排序之字典排序

字典序全排列算法研究 一. 非递归算法(字典序法) 对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后. 例如:字符集{1,2,3},较小的数字位置较先,这样按字典序生成的全排列是 123,132,213,231,312,321 ※ 一个全排列可看做一个字符串,字符串可有前缀.后缀. 生成给定全排列的下一个排列.所谓一个的下一个就是这一个与下一个之间没有其他的.这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上. 对

五 数据组织模式 4)全排序、混排。

前面讲的 分区.分箱模式 都是不关心数据的顺序. 接下来 全排序.混排序模式 关心的是数据按照指定键进行并行排序. 全排序解释: 排序在顺序结构程序中容易实现, 但是在MapReduce 中,或者说在并行编程中不易实现.这是典型的 "分治法". 每个 reduce 将按照键对他的数据排序,但这种排序并不是全局意义上的排序. 这里想做的是全排序,记录是整个数据集按照顺序排列好的. 作用: 排序号的数据有很多有用的特性,比如时间排序可以提供一个基于时间轴的视图.在一个已排序好的数据集中查找

M/R全排序

例如:1KW数据,200个map,100个reduce. (1)map阶段,每个map分别局部排序,得到200个排好顺序的结果 (2)对所有的数据进行99个抽样s1,s2...s99(按照顺序排列) (3)根据每个map中数据在抽样数据的前后,将每个map划分成(最多)100个部分m1-1,m1-2....m1-100,m2-1,m2-2...m2-100...m200-1,m200-2,m200-100,所有map(最多)2W个部分 (4)这2W个部分每个部分按照抽样和抽样的比较分别放在每个抽

全排序与康拓展开

全排列: n=3 123 132 213 231 312 321 (由1~n组成,且出现一次,从小到大排序(或从大到小排序,或不排序)) 求全排序: I. Dfs1 //全排序没有顺序 #include <iostream> using namespace std; long a[100],n; void swap(long &a,long &b) { long temp; temp=a; a=b; b=temp; } void dfs(long pos) { long i;

hive全排序

全排序 hive的排序关键字是SORT BY,它有意区别于传统数据库的ORDER BY也是为了强调两者的区别–SORT BY只能在单机范围内排序. 1.1.1     例1 set mapred.reduce.tasks=2; 原值 select cookie_id,page_id,id fromc02_clickstat_fatdt1 where cookie_idIN('1.193.131.218.1288611279693.0','1.193.148.164.1288609861509.2

全排序的两种想法

字典序全排序: 1 import java.util.Arrays; 2 import java.util.Scanner; 3 public class Cao41 { 4 /** 5 * @param 第一行输入个数N,第二行输入序列1-9, 6 * 输出字典序排列 具体做法如下: 首先要将数组a从小到大排序,输出第一个排序,然后进入循环 先用getindex方法找到最靠后的,后面有比啊a[index]大的index,当index不存在设index=-1,结束循环. 然后从 index到en

Hadoop实现全排序

1.1TB(或1分钟)排序的冠军 作为分布式数据处理的框架,集群的数据处理能力究竟有多快?或许1TB排序可以作为衡量的标准之一. 1TB排序,就是对1TB(1024GB,大约100亿行数据)的数据进行排序.2008年,Hadoop赢得1TB排序基准评估第一名,排序1TB数据耗时209秒.后来,1TB排序被1分钟排序所取代,1分钟排序指的是在一分钟内尽可能多的排序.2009年,在一个1406个节点组成的hadoop集群,在59秒里对500GB完成了排序:而在1460个节点的集群,排序1TB数据只花

hadoop —— Reducer全排序

目录 一.关于Reducer全排序 1.1. 什么叫全排序 1.2. 分区的标准是什么 二.全排序的三种方式 2.1. 一个Reducer 2.2. 自定义分区函数 2.3. 采样 一.关于Reducer全排序 1.1.什么叫全排序? 在所有的分区(Reducer)中,KEY都是有序的: 正确举例:如Reducer分区1中的KEY是1.3.4,分区2中的key是5.8.9 错误举例:如Reducer分区1中的KEY是1.3.4,分区2中的key是2.7.9 1.2.数据分区的标准是什么? 默认的

Hadoop---mapreduce排序和二次排序以及全排序

自己学习排序和二次排序的知识整理如下. 1.Hadoop的序列化格式介绍:Writable 2.Hadoop的key排序逻辑 3.全排序 4.如何自定义自己的Writable类型 5.如何实现二次排序 1.Hadoop的序列化格式介绍:Writable 要了解和编写MR实现排序必须要知道的第一个知识点就是Writable相关的接口和类,这些是HADOOP自己的序列化格式.更多的可能是要关注他的Subinterfaces:WritableComparable<T>.他是继承Writable和Co