递归算法:求序列的全排列

用C++模板书写一段序列数组的全部排列

/**
* 书本:【windows程序设计】
* 功能:输出全部的排列情况
* 文件:全排列.cpp
* 时间:2014年9月29日21:52:55
* 作者:cutter_point
*/

#include <iostream>

using namespace std;

//交换两个元素的函数
template<class Type>
inline void Swap(Type &a, Type &b)  //取两个元素的引用,等会来交换
{
    Type temp=a;
    a=b;
    b=temp;
}

//这个是一个递归为了输出全部的排列情况
template<class Type>
void Perm(Type list[], int k, int m)
{
    //这个函数是为了产生全部的排列情况
    if(k == m)  //就是当k和m相等的时候,就输出序列
    {//就是剩下一个元素的时候
        for(int i=0 ; i <= m ; ++i)
            cout<<list[i]<<' ';
        cout<<endl;
    }
    else    //还有多个元素等待排列,递归产生排列
    {
        for(int i=k ; i <= m ; ++i) //从第k个开始吧第k个和i个交换输出
        {
            Swap(list[k], list[i]); //交换第k和第i个元素
            Perm(list, k+1, m);     //只要不是最后一个,就是第二个参数不是最后一个时,调用自己
            Swap(list[i], list[k]); //换回来,进行下一个排列的变换
        }
    }
}

int main()
{
    int n;      //要进行排序的个数
    //定义一个序列的个数
    cout<<"输入你想要进行排序的个数"<<endl;
    cin>>n;
    int a[n];   //存放全部的个数
    cout<<"输入序列:"<<endl;
    for(int i=0 ; i < sizeof(a)/sizeof(int) ; ++i)
        cin>>a[i];

    cout<<"全部的排序结果:"<<endl;
    Perm(a, 0, sizeof(a)/sizeof(int)-1);

    int m;      //要进行排序的个数
    //定义一个序列的个数
    cout<<"输入你想要进行排序的字符个数"<<endl;
    cin>>m;
    char b[m];   //存放全部的个数
    cout<<"输入字符序列:"<<endl;
    for(int i=0 ; i < sizeof(b)/sizeof(char) ; ++i)
        cin>>b[i];

    cout<<"全部的排序结果:"<<endl;
    Perm(b, 0, sizeof(b)/sizeof(char)-1);

    return 0;
}

我在想我是接下来搞算法还是搞QT呢????

时间: 2024-10-24 21:34:46

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

akoj-1048-求某一整数序列的全排列问题

求某一整数序列的全排列问题 Time Limit:1000MS  Memory Limit:65536K Total Submit:35 Accepted:16 Description 现有一整数序列如:123,请计算出它的全排列. Input 输入数据有两行组成,第一行为整数序列的长度,第二行为整数序列,序列元素之间以Tab符相隔. Output 输出数据为整数序列的全排列,每一个排列单独占一行. Sample Input 3 1 2 3 Sample Output 123 132 213 2

求序列完美度(trie+贪心)

题目链接: 求序列完美度 题目描述 给出由n个数组成的序列s,规定第i个数s[i]到第j个数s[j]组成的子序列的完美度为该子序列中所有数的和与任意一个不在该子序列中的数进行异或运算得到的值中的最大值,即perfect(s[i]~s[j])=max(sum(s[i]~s[j])^x),x为非子序列的数.现求完美度最大的子序列与它的完美度是多少 输入 第一行输入一个数T表示共有T组数据 输入一个数n表示序列有n个数 接下来有n个数,角标为1-n,表示序列的组成 1<=T<=100 3<=n

循环-10. 求序列前N项和(15)

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和.注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在一行中输出部分和的值,精确到小数点后2位.题目保证计算结果不超过双精度范围. 输入样例: 20 输出样例: 32.66 #include <iostream> #include <stdio.h> using namespace std; int main(){ i

POJ 2104 求序列里第K大 主席树裸体题

给定一个n的序列,有m个询问 每次询问求l-r 里面第k大的数字是什么 只有询问,没有修改 可以用归并树和划分树(我都没学过..囧) 我是专门冲着弄主席树来的 对主席树的建树方式有点了解了,不过这题为什么是在主席树里面这么操作的 还是有点不懂,今天照着模板敲了一遍就打多校了 再研究吧 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using name

POJ 2299 Ultra-QuickSort (求序列的逆序对数)

题意:废话了一大堆就是要你去求一个序列冒泡排序所需的交换的次数. 思路:实际上是要你去求一个序列的逆序队数 看案例: 9 1 0 5 4 9后面比它小的的数有4个 1后面有1个 0后面没有 5后面1个 4后面没有 所以结果为4+1+0+1+0=6 所以逆序对的定义如果不清楚可以自己总结了 这道题说白了就是要你用归并排序求逆序对数. 下面是搜到某牛给的逆序对数的方法: 假设回溯到某一步,后面的两部分已经排好序(就是说当前需要归并的两个部分都是分别有序的),假设这两个序列为 序列a1:2 3 5 9

不用遍历 递归算法 求数组中数字的最大值

#include "stdio.h"int ax[] ={1000,5,6,8,9,800,5,200,3,6,5,8,9};int paixu (int n, int ret){    if (n==0) return ret>ax[0]?ret:ax[0];    int ret1= ret>ax[n]? ret:ax[n];    return paixu(n-1,ret1);}int main(int argc, char* argv[]){    int numb

递归算法——求取斐波那契数列(2)

import java.util.Scanner; /** * Created by Administrator on 14-5-13. * 改进的计算斐波那契数列的方法,利用参数,经过测试运行时间会成倍减少 测试数据n=40 * 尾递归的本质是:将单次计算的结果缓存起来,传递给下次调用,相当于自动累积. * 尾部递归是一种编程技巧.递归函数是指一些会在函数内调用自己的函数, * 如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归. * 尾部递归的函数有助将算法转化成函数编程语言,

递归算法——求取斐波那契数列(1)

import java.util.Scanner; /** * Created by Administrator on 14-5-13. * 计算斐波那契数列 * * Result M(Problem prob) { if (<problem can be solved easily>) return <easy solution>; // The problem cannot be solved easily. Problem smaller1 = <reduce prob

循环-10. 求序列前N项和

1 /* 2 * Main.c 3 * C10-循环-10. 求序列前N项和 4 * Created on: 2014年7月30日 5 * Author: Boomkeeper 6 *******部分通过******* 7 */ 8 9 #include <stdio.h> 10 11 int main(void) { 12 13 double sum = 0.0; //记录前N项和 14 int numerator = 2,denominator = 1; //分子分母 15 int N;