• C语言学习-19-全排列


    一、测试环境

    名称版本
    操作系统win10
    CPU12th Gen Intel® Core™ i7-12700H
    内存16G
    VS2017

    二、个人理解

    假设数据:{1,2,3}进行全排列。
    我们可以先分为三种情况:

    (1)以1为开头的组合

    {1,{剩下元素进行全排列}}

    (2)以2为开头的组合

    {2,{剩下元素进行全排列}}

    (3)以3为开头的组合

    {3,{剩下元素进行全排列}}

    也就是说每个元素都要放到首位,剩余的元素进行全排列,有没有感觉规律很明显,可以用递归的方式尝试解决,编写递归函数时,
    一:我们需要找到规律。
    二:我们需要找到结束点。
    一我们已经找到我们来开始找二。


    中间剩下元素进行全排列,又可以分为两种情况(这里以第一组为例):

    (1)以2为开头的组合

    {2,{剩下元素进行全排列}}

    (2)以3为开头的组合

    {3,{剩下元素进行全排列}}

    最后就剩下一个元素了,说明数组已经遍历完,可以结束,这样我们就找到了结束条件。

    三、源码

    #include <stdio.h>
    #include <time.h>
    
    void PrintArray(int Array[], int ArraySize);
    void SwapArrayElement(int Array[], int index_1, int index_2);
    void AllPermutaion(int Array[], int top, int end);
    void ComputeProcedureTime(void(*Func)(int*, int, int), int Array[], int index_1, int index_2);
    
    int main() 
    {
        int Array[] = { 1 ,2 ,3 };
        int ArraySize = sizeof(Array) / sizeof(int);
        ComputeProcedureTime(AllPermutaion, Array, 0, ArraySize - 1);
    }
    
    void ComputeProcedureTime(void (*Func)(int[], int, int), int Array[], int index_1, int index_2)
    {
        printf("++++++++++++++++++++++++\n");
        clock_t start, finish;
        clock_t Total_time;
        start = clock();
    
        Func(Array, index_1, index_2);
    
        finish = clock();
        Total_time = finish - start;
        printf("Elapsed Time : %ld ms\n", Total_time);
    }
    
    void PrintArray(int Array[], int ArraySize)
    {
        int i;
        for ( i = 0; i < ArraySize; i++)
        {
            printf("%d ",Array[i]);
        }
        printf("\n");
    }
    
    void SwapArrayElement(int Array[], int index_1, int index_2)
    {
        //如果位置相等,说明是同一个元素,不用进行交换,可以稍微提升一点效率。
        if (index_1 != index_2)
        {
            int temp = Array[index_1];
            Array[index_1] = Array[index_2];
            Array[index_2] = temp;
        }
    }
    
    void AllPermutaion(int Array[], int top, int end)
    {
        //如果位置相等,说明数组里的元素已经遍历完,我们可以打印一下数组结果。
        if (top == end)
        {
            PrintArray(Array, end + 1);
        }
        else
        {
            int i;
            for ( i = top; i <= end; i++)
            {
                SwapArrayElement(Array, i, top);
                AllPermutaion(Array, top + 1, end);
                SwapArrayElement(Array, i, top);
                //交换两次元素,是为了避免出现重复结果。
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    四、测试结果

    ++++++++++++++++++++++++
    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 2 1
    3 1 2
    Elapsed Time : 3 ms
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

  • 相关阅读:
    C语言之自定义类型_结构体篇(1)
    用归并排序算法merge_sort( )求解 逆序对的数量 降低时间复杂度为 nlogn
    光学知识整理-偏振光
    《蛤蟆先生去看心里医生》阅读笔记
    使用 Spark Java 框架构建 API
    Chrome iframe 跨域失败
    Go方法特性详解:简单性和高效性的充分体现
    Yarn调度器
    fastapi_No.21_安全性_目录权限认证
    Java之线程的概念及方法的学习
  • 原文地址:https://blog.csdn.net/qq_45111959/article/details/125429836