`
Touch_2011
  • 浏览: 291117 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

几种全排列的算法(C语言实现)

阅读更多
/* 
 * 几种排列组合的算法
 */

#include<stdio.h>

int a[20];
int n;

//打印数组
void showArray(int *a)
{
	int i;
	for(i=1;i<=n;i++)
    	printf("%d",a[i]);
	printf("\n");
}

//翻转法
void overturn()
{
	int i,temp,temp1,temp2,j;
	int b[20];
	for(i=1;i<=n;i++)
		*(b+n-i+1)=*(a+i);
	showArray(b);
	for(i=1;i<=n;i++){
		//判断第一个数是否为1
		if(i==1 && b[i]!=i){
			temp=b[i];
			for(j=1;j<n;j++)
				b[j]=b[j+1];
			b[j]=temp;
			showArray(b);
			i=0;
			continue;
		}
    	//判断第二个数是否为1
		if(i==2 && b[i]!=i){
			temp1=b[i];
			temp2=b[i-1];
			for(j=1;j+2<=n;j++)
				b[j]=b[j+2];
			b[j]=temp1;
			b[j+1]=temp2;
			showArray(b);
			i=0;
			continue;
		}
       	//判断第三个数是否为1
		if(i==3 && b[i]!=i){
			temp=b[i];
			temp1=b[i-1];
			temp2=b[i-2];
			for(j=1;j+3<=n;j++)
				b[j]=b[j+3];
			b[j++]=temp;
			b[j++]=temp1;
			b[j]=temp2;
			showArray(b);
			i=0;
			continue;
		}
	}
}

//换位法
void changeSite()
{
	int i,temp,temp1;
	int b[20],max=0;
	int dir[20]={-1,-1,-1,-1,-1,-1};
	for(i=1;i<=n;i++)
		*(b+i)=*(a+i);
	showArray(b);
	while(1){
		max=0;
		b[max]=0;
		//寻找最大的活结点
    	for(i=1;i<=n;i++){
    		if(i+dir[i]>0 && i+dir[i]<=n && b[i]>b[i+dir[i]])
				max=b[i]>b[max]?i:max;
		}
    	if(max==0)
	    	break;
		//交换位置和方向
        temp=b[max];
    	b[max]=b[max+dir[max]];
        b[max+dir[max]]=temp;
		temp1=dir[max+dir[max]];
		dir[max+dir[max]]=dir[max];
        dir[max]=temp1;
		//改变比活结点大的数的方向
    	for(i=1;i<=n;i++)
    		if(b[i]>temp)
	    		dir[i]=-dir[i];
        showArray(b);
	}
}

//序数法(排出的序列为有序的)
//str:待排序的字符序列 n:首字符下标 len:字符串长度
void ordinal(char * str,int n,int len)
{
	int i;
	char temp;
	if(n==len)
		puts(str);
	for(i=n;i<len;i++){
		temp=str[i];
		str[i]=str[n];
		str[n]=temp;
		ordinal(str,n+1,len);
		temp=str[i];
		str[i]=str[n];
		str[n]=temp;
	}
}

void main()
{
	int i;
	char str[20];
	for(i=1;i<=4;i++)
		a[i]=i;
	a[0]=n=4;
	printf("对1234这四个数进行全排列\n");
	printf("翻转法:\n");
	overturn();
	printf("换位法:\n");
	changeSite();
	printf("序数法:\n");
	for(i=0;i<n;i++)
		str[i]=a[i+1]+'0';
	str[i]=0;
	ordinal(str,0,n);
}

 

0
4
分享到:
评论

相关推荐

    一种计算全排列的简易算法

    文件名“c_N_array.doc”可能是一个文档,详细解释了这个C语言实现的全排列算法。其中可能包含了代码示例,讲解了如何使用数组来存储和生成全排列,也可能讨论了算法的时间复杂度和空间复杂度。 另一份文件“c4.txt...

    C语言实现全排列算法模板的方法

    总结起来,全排列算法的实现主要涉及到以下几个关键点: 1. 递归思想的应用,将大问题分解为小问题。 2. 数组操作,包括元素的交换和遍历。 3. 指针的使用,通过指针交换变量的值。 4. 递归函数的设计,包括基本情况...

    算法合集 算法的C语言描述

    根据给定文件的信息,我们可以将涉及的算法知识点分为以下几部分进行详细说明: ### 一、数论算法 #### 1. 最大公约数 (GCD) - **定义**: 给定两个正整数 `a` 和 `b`,最大公约数是能够同时整除它们的最大正整数。...

    qpl.rar_全排列

    在学习全排列算法时,还要注意以下几点: - 空间复杂度:全排列算法通常需要O(n)的空间,因为需要存储当前的排列状态。 - 时间复杂度:全排列的时间复杂度是O(n!),因为对于n个不同的元素,有n!种排列方式。 - 回溯...

    n阶行列式计算 C语言 实现

    根据给定的信息,本文将详细解释“n阶行列式计算 C语言实现”的核心知识点,包括如何使用C语言来实现n阶行列式的计算方法,并对代码中的关键部分进行深入解析。 ### 一、n阶行列式的定义与计算原理 在数学中,行列...

    C语言入门-leetcode练习之第46题全排列.zip

    **全排列算法思路**: 1. **递归**:首先,从数组的第一个元素开始,将它与剩余元素进行排列,然后对剩余元素递归进行全排列。 2. **回溯**:在递归过程中,当处理到某一层时,如果发现当前的排列不符合全排列的...

    ACM/ICPC算法大全(c语言)

    ### ACM/ICPC算法大全(C语言)知识点概览 #### 图论(Graph Theory) ... - 介绍了几种常见的取石子游戏规则及解法。 - **集合划分问题** - 如何将一个集合划分为若干个子集。 - **大数平方根(字符串数组...

    C语言原程序二十四点游戏的编程思路与基本算法.txt

    ### C语言原程序二十四点游戏的编程思路与基本算法 #### 一、二十四点游戏简介 二十四点游戏是一种数学益智游戏,玩家需要利用给定的四张牌(每张牌上的数字范围一般为1至13),通过加、减、乘、除四种运算(可以...

    qpl.zip_independent45w_全排列

    以下是一个简单的C语言实现全排列的递归示例: ```c #include void permute(int arr[], int start, int end) { if (start == end) { for (int i = 0; i ; ++i) { printf("%d ", arr[i]); } printf("\n"); }...

    C语言编程题目1.pdf

    例如,可能需要通过算法判断一组数的全排列是否存在于另一组数的序列中。这要求掌握一些基本的算法知识,如排序算法、搜索算法等。 6. 文件的组织结构:题目描述中提到输入由若干个块组成,每个块代表一列火车,每...

    100个经典C语言程序资料.doc

    C语言,作为一种广泛使用的高级编程语言,不仅在学术界被广泛教授,也在工业界拥有不可动摇的地位。本文档“100个经典C语言程序资料.doc”为我们提供了一个宝贵的资源,包含了一系列精选的C语言程序,旨在帮助学习者...

    ACM 算法模板大全

    快速排序是一种高效的排序算法,平均时间复杂度为O(NlogN),通过分治策略实现。 **最长公共递增子序列O(N^2)** 最长公共递增子序列问题旨在寻找两个序列中的最长公共递增子序列。 **最长有序子序列** 最长有序子...

    C语言经典源码100

    最后一个代码片段提供了一个简单的三数排序算法,它通过比较和交换操作,实现了将三个输入数字按从小到大的顺序排列。这里使用了临时变量`t`来进行值的交换,展示了基本的排序逻辑和变量管理技巧。 以上五个知识点...

    C语言入门-leetcode练习之第60题排列序列.zip

    编写C语言代码时,注意以下几点: 1. 初始化数组:创建一个足够大的数组来存储当前的排列。 2. 使用递归函数:定义一个函数,接受数组、已使用的数字数量和剩余的数字数量作为参数。 3. 检查基本情况:当所有数字都...

    手写代码C语言

    根据给定文件的信息,我们可以提炼出以下几个核心知识点: ### 1. 目标读者与应用场景 - **目标读者**:本书主要面向准备去北美或国内求职的程序员,以及初次接触ACM算法竞赛的新手。 - **应用场景**:适用于求职...

Global site tag (gtag.js) - Google Analytics