`
美丽的小岛
  • 浏览: 308232 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

全排列的实现(C)

 
阅读更多

找工作,笔试经常会出现一个题,怎样生成一个集合内所有元素的全排列。刚开始的时候没有觉得这是一个难的问题。其实,当写在试卷上,真的不太会,作答的过程感觉心里没有什么底。

回来后,查了一些资料,看了一些书,对这个问题有一定的认识,举一个例去清晰一下题目的意思,例子为:字符集{1,2,3}的全排列:123,132,312,321,231,213。

进一步认识全排列生成:

进一步方法考察:


 
 经过学习与查找,找到如下的算法描述:

觉得这个算法提供一个实现能枚举全部合条件的数据,用C语言进行一个实现:

#include<stdio.h>
#define N 4
typedef struct node{
        int value ;
        int flag ;
}node;

node a[N] ;

void init(){
    int i  ;
    for(i = 0 ; i < N ; i++){
        a[i].value = i + 1 ;
        a[i].flag = 0 ;//向左指向的
    }
}

void change_flag(int n){
    int i ;
    for(i = 0 ; i < N ; i++){
        if(a[i].value > n){
            a[i].flag = (a[i].flag == 1) ? 0 : 1 ;
        }
    }
}

void exchange(int x,int y){
        int temp ;
        int f ;
        temp = a[x].value ;
        f = a[x].flag ;
        a[x].value = a[y].value ;
        a[x].flag = a[y].flag ;
        a[y].value = temp ;
        a[y].flag = f ;
}
int main(){
    init() ;
    int i , j ,max_ind ;
    int  max;
    int count = 0 ;
    while(1){
        ++count ;
        for(i = 0 ; i < N ; i++){
            printf("%d",a[i].value) ;
        }
        printf("\n") ;
        max_ind = 0 ;
        max = -1 ;
        for(i = 0 ; i< N ; i++){//最大的数下标
            if(a[i].flag){//向右指
                if( i < N-1 && a[i+1].value<a[i].value && max < a[i].value) {
                    max_ind = i ;
                    max = a[i].value ;
                }//右边的数比较小
            }
            else{//向左指
                if( i > 0 && a[i-1].value < a[i].value && max < a[i].value ) {
                    max_ind = i ;
                    max = a[i].value ;
                }//左边的数比较小
            }
        }
        if(max == -1){break ;}
        change_flag(a[max_ind].value) ;
        if(a[max_ind].flag){//向右指时,与右边的交换
            j = max_ind + 1 ;
        }
        else{//向左指,与左边的与之交换
            j = max_ind - 1 ;
        }
        exchange(max_ind,j) ;
    }
    printf("sum = %d",count) ;
    return 0 ;
}

 看看程序运行结果:


虽然实现了,可是代码一点都不简洁,请各位多多指教。
 

 

 

 

  • 大小: 31.9 KB
  • 大小: 36.3 KB
  • 大小: 11.9 KB
  • 大小: 18.1 KB
  • 大小: 68.5 KB
0
2
分享到:
评论

相关推荐

    全排列c语言实现

    全排列c语言实现,经典的算法适合收藏起来看之又看,翻来覆去看

    全排列C语言版

    递归算法基本,输出一个数列的全排列,C语言实现

    非递归对输入的数字进行全排列_C语言实现

    上传之后才发现头文件少了个ctype.h,因为判断非法输入的时候用到了isalpha(),不加这个头文件的话在gcc下会有警告,在VC下可能编译不过! 首先把输入的各个数由小到大进行排序,然后开始 1.找出比右边数字小的第一...

    求一个动态数组的全排列,c语言实现

    用c语言实现对一个动态数组的全排列,其中保存生成的全排列用了一个二维指针,求全排列用的递归的方法,代码在vc++6.0下调试通过,并附有详细注释。

    五个数的全排列

    在这个场景中,我们关注的是使用C语言来实现对5个数的全排列。C语言是一种底层、高效的编程语言,适合处理这种计算密集型的任务。 全排列的实现通常采用回溯法或递归策略。回溯法是一种试探性的解决问题的方法,当...

    C语言实现全排列源文件

    本源程序经过测试正常运行,且修改数组时有提示修改相关地方即可正确使用,不必理解程序是如何实现(采用递归分治策略实现)的。

    C语言实现的全排列算法

    在本例中,我们讨论的是使用C语言实现的全排列算法,主要关注递归方法。 在C语言中,全排列的实现通常基于回溯法。回溯法是一种试探性的解决问题的方法,它尝试分步地构造解决方案,并在每一步选择时,如果发现当前...

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

    本文将详细介绍几种C语言实现全排列的算法,并结合“排列组合ppt详解及源代码”进行深入解析。 1. **回溯法**: 回溯法是一种试探性的解决问题方法,当发现某一步选择不正确时,可以退回一步甚至多步,重新选择...

    JAVA递归实现全排列

    JAVA递归实现全排列算法,含实现源代码,如a、b、c、d的全排列为: abcd abdc acbd acdb adcb adbc bacd badc bcad bcda bdca bdac cbad cbda cabd cadb cdab cdba dbca dbac dcba dcab dacb dabc

    全排列算法实现(C)

    实现全排列组合的算法,供大家学习与参考。在需要对排列组合做差异分析的时候可以直接使用。例如:几个正则式的不同排列组合对匹配效果的影响

    objective-c数组全排列算法

    下面,我们将详细探讨如何使用Objective-C实现全排列算法,并通过数组保存结果。 首先,我们需要定义一个数组来存储原始数据,然后创建一个方法来处理全排列。这个方法将接收两个参数:一是原始数组,二是用于保存...

    全排列VisualC++程序

    在本例中,我们关注的是VC++编程环境下的全排列实现,具体体现在名为"perm.cpp"的源代码文件中。 在VC++环境下编写全排列程序,通常涉及到递归或迭代的编程技巧。递归方法是通过调用自身来解决问题,而迭代方法则是...

    Java实现字符数组全排列的方法

    下面我们将深入探讨如何使用Java实现字符数组的全排列。 首先,我们需要了解回溯法。回溯法是一种试探性的解决问题方法,它尝试逐步找到问题的所有解。当发现某一步无法继续找到有效解时,会退回一步,尝试其他的...

    C/C++全排列

    在C/C++编程语言中,实现全排列通常需要借助递归或回溯法。以下是对全排列及其C/C++实现的详细解释。 首先,全排列是指从给定的n个不同元素中取出所有可能的m个元素的排列方式,其中m小于等于n。如果m等于n,那么这...

    序数法全排列

    序数法全排列是指使用序数法来生成全排列的算法,该算法结合组合数学上的思想,可以使用C语言实现。下面将对序数法全排列的知识点进行详细的解释: 1. 序数法的基本概念 序数法是一种生成全排列的方法,它基于组合...

    全排列算法实现(java\c#\c++,各种主流语言版本)

    这个C代码展示了全排列的递归实现。`perm`函数接受一个数组、当前处理的元素的索引k和数组长度m。当k大于m时,表示已经到达数组末尾,此时打印当前排列并增加计数器n。否则,遍历k到m的所有元素,与基准点交换位置,...

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

    C语言实现全排列算法模板的方法 本文主要介绍了C语言实现全排列算法模板的方法,旨在帮助读者更好地理解和掌握全排列算法的实现过程。全排列算法是计算机科学中的一种重要算法,用于生成所有可能的排列组合。在实践...

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

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

    c语言递归算法实现数列全排列.pdf

    c语言递归算法实现数列全排列.pdf

    全排列算法

    在C++编程中,实现全排列通常采用递归的方法,这种方法简洁且易于理解。下面我们将深入探讨全排列的原理、C++实现以及相关优化策略。 首先,全排列是指从n个不同元素中取出m个元素(m≤n),按照一定的顺序排成一列...

Global site tag (gtag.js) - Google Analytics