C语言实现排列组合

C语言实现排列组合

如何用C语言实现整数的全排列?下面我来简单叙述

我目前掌握的是递归思想,相对好理解一些,只是效率不敢恭维。以后掌握其他方法还会来更新的。
先看效果
在这里插入图片描述

首先,我们先来思考,如何对四个数字,比如2345进行全排列?
可以这样思考,先固定2,即保持2是第一个位置不变,对345进行全排列。那如何对345进行全排列?先固定3,对45进行全排列。如何对45进行全排列?先固定4,那么只剩5了
在这里插入图片描述

显然,光这样是不够的,这只是递归思想的一个轮廓。为什么说这样是不够的呢,因为如果仅仅固定2对345进行全排列,显然不能称为2345 的全排列。同理,仅仅固定3对45进行全排列,也不能成为345的全排列。因此,对于每一个单位(2345是一个单位,345是一个单位,45是一单位),我们需要依次交换单位中每个元素与该单位第一个元素的位置,
然后每一个单位就会生成更多的子单位,在这里插入图片描述
这些子单位进行上述相同的处理。对345进行上述处理,使其分裂为345,435,543 3个单位
对45进行上述处理,使其分裂为45和54

每次到末尾,就打印数组,开始进行递归中的“归”。值得一提的是,每次交换完并且执行递归函数后,都要再交换回去,方便下一次交换,比如,2345,交换3与2,变为3245,进行一组递归后,需交换回来重新变成2345从而方便4与2的交换。


```c
int n = 0;//全局变量,作为计数器,计算进行了几次打印
Swap(int* a, int* b){
	int tem = *a;
	*a = *b;
	*b = tem;
}
void perm(int arr[], int k, int m){//k的含义为从第arr[k]起,对后面的元素进行全排列。m为数组大小减一,即最后一个元素的下标,是递归结束的标志
	if (k>m){
		for (int i = 0; i <= m; i++){
			printf("%d", arr[i]);
		}
		printf("\n");
		n++;
	}
	else{
		for (int i = k; i <= m; i++){
			Swap(&arr[k], &arr[i]);
			perm(arr, k + 1,m);
			Swap(&arr[k], &arr[i]);
		}
	}
}
void main(){
	int arr[] = {  2, 3, 4, 5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	perm(arr, 0, sz-1);
	printf("总数为:%d!=%d\n", sz, n);

}

``

  • 13
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值