zoukankan      html  css  js  c++  java
  • 排列与组合的C语言实现

    排列与组合是数学里的经典问题,由这个问题可引申出子集、字典排序等问题,那么,我们先看经典的排列与组合,怎么在程序里实现。

    在网上搜了一下,关注这个问题的人还是挺多的,有不了人给出的回答是使用几个for循环进行嵌套,例如取3个数的排列则使用3for循环i,j,k嵌套,当i,j,k互不相等时进行输出,这样的函数虽然是正确的,但是没有通用性,我们要实现的是从m中取nmn皆为变量。

     

    通过数学公式我们知道,

     

    先来看排列的实现,假如集合为{ABC},取出2个的排列为AB AC BA BC CA CB,从这里我们不难看出,第一个字母可从{ABC}中任取一个,假如选了A,第二字母从剩下的集合中{BC}再任选一个,这样便完成了排列,规则其实很简单,取n个数,从第一个数开始选,选完之后从集合中去掉这个数,开始选第2个数,一直到取第n个数为止。

     

    程序里我们这样设计,对一个数组里的元素进行排列,我们可将数组分为两部分,已排集合及未排的集合,每次挑选第i个数时,arr[0]arr[i-1]为已排集合,未排集合为arr[i]arr[m-1],这里从未排集合中依次取出一个元素,交到当前arr[i]的位置,此时未排集合变为arr[i+1]arr[m-1],并开始递归选择i+1个数,直到i=n,选择结束,请看下图:

     

     

    下面来看组合数的情况,设集合为{ABCD},选则3个数进行组合,组合情况为:

    ABC

    ABD

    ACD

    BCD

    情况与排列的类似,但有一点不同的是,假设第一个数选了A,则剩下的集合为{BCD},这样便输出了所有包含A的组合情况;这时,当第一个数选了B时,则剩下的集合为{CD},而不是{ACD},因为所有包含A的组合已经输出了,即A已经从当前集合中排除了。

     

    程序里我们这样设计,对一个数组里的元素进行排列,我们可将数组分为两部分,已选择的集合及未排的集合,每次挑选第i个数时,arr[0]arr[i-1]为已排元素,未排集合为arr[j]arr[m-1],这里未排集合中依次取出一个元素,假设为arr[k],其中k[j,m-1]之间,交换到当前arr[i]的位置,此时未排集合为arr[k+1]arr[m-1],并开始递归选择i+1个数,直到i=n,选择结束。

     

    【查看完整代码实现】

  • 相关阅读:
    JavaScript入门基础(三)
    JavaScript入门基础(二)
    Web页面该如何布局
    如何通过SQL创建删除表的索引,UNIQUE KEY
    vim使用大全
    安装vmwaretools后 真机和虚拟机仍不能复制黏贴
    php通用函数html时间文件大小生成随机数
    Centos下安装配置phpmyadmin
    [Leetcode 43] 11 Container With Most Water
    [Leetcode 39] 129 Sum Root to Leaf Numbers
  • 原文地址:https://www.cnblogs.com/chaofeng/p/3576963.html
Copyright © 2011-2022 走看看