全排列的C语言实现


  大一的时候没有好好学,后来都是要还的QAQ

  大三重修了C语言(刷分)。再次遇到了全排列这道题,之前是直接抄的书上的代码,没有认真理解意思。在大二学习中也知道了全排列是依靠递归实现的,索性这次就没有参考文章,自己写了一个全排列出来。(代码运行效率看起来还可以)

  核心思想是递归地交换两个数字。for循环意味着对level-1之后的数字遍历交换一次。

  因为交换了数字,所以在递归出口的时候要把之前的交换还原。(想象整个过程,而不是细节就会明白)

  写出来也挺简单的,十几分钟的事情orz,还是大一太佛了,没有认真学习,否则现在也不会这么艰难啊QAQ。

  不说了不说了,最后附上代码:

输入:一个数字n,代表hash数组中的前几位参与全排列。

输出:数字的全排列,以从小到大的顺序排列,共$A^n_n$个

#include <stdio.h>
int hash[15] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int loc;

void print()
{
    int i;
    for(i = 0; i < loc; i++)
        printf("%d ", hash[i]);
    printf("\n");
    return;
}

void swap(int src, int dst)
{
    int temp;
    temp = hash[src];
    hash[src] = hash[dst];
    hash[dst] = temp;

}

void sort(int level)
{
    int i;
    if(level == loc){
        print();
        return;
    }
    sort(level + 1);
    for(i = 0; i+level < loc; i++){
        swap(level + i, level - 1);
        sort(level + 1);
    }
    for(i = loc - level - 1; i>= 0;i--)
        swap(level+i, level - 1);
}

int main()
{
    scanf("%d", &loc);
    sort(1);
    return 0;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM