• C语言练习百题之将一个数组逆序输出


    题目:将一个数组逆序输出

    程序分析

    要将一个数组逆序输出,可以使用多种方法。基本思路是将数组中的元素顺序颠倒过来,将第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,以此类推。

    方法1: 使用循环遍历实现

    思路

    1. 使用两个指针,一个指向数组的第一个元素,另一个指向数组的最后一个元素。
    2. 交换这两个指针所指向的元素。
    3. 将第一个指针向后移动,将最后一个指针向前移动。
    4. 重复步骤2和3,直到第一个指针不小于最后一个指针。
    5. 数组的元素顺序已经被逆序修改。

    代码

    #include 
    
    void reverseArray(int arr[], int length) {
        int start = 0;
        int end = length - 1;
    
        while (start < end) {
            // 交换数组中的元素
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
    
            start++;
            end--;
        }
    }
    
    int main() {
        int arr[] = {1, 2, 3, 4, 5};
        int length = sizeof(arr) / sizeof(arr[0]);
    
        reverseArray(arr, length);
    
        printf("逆序数组: ");
        for (int i = 0; i < length; i++) {
            printf("%d ", arr[i]);
        }
    
        return 0;
    }
    
    • 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

    优点

    • 不需要额外的内存空间,直接修改原数组。
    • 算法简单,空间复杂度低。

    缺点

    • 修改了原数组的顺序,可能不适用于需要保持原数组不变的情况。

    方法2: 使用递归实现

    思路

    1. 递归方法的基本情况是数组为空或只有一个元素,此时无需逆序操作,直接返回原数组。
    2. 对于其他情况,可以递归地将数组的子部分逆序,然后将第一个元素放在逆序后的数组的末尾。
    3. 递归终止条件是数组长度为0或1。

    代码

    #include 
    
    void reverseArrayRecursive(int arr[], int start, int end) {
        if (start >= end) {
            return;
        }
    
        // 交换数组中的元素
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
    
        reverseArrayRecursive(arr, start + 1, end - 1);
    }
    
    void reverseArray(int arr[], int length) {
        reverseArrayRecursive(arr, 0, length - 1);
    }
    
    int main() {
        int arr[] = {1, 2, 3, 4, 5};
        int length = sizeof(arr) / sizeof(arr[0]);
    
        reverseArray(arr, length);
    
        printf("逆序数组: ");
        for (int i = 0; i < length; i++) {
            printf("%d ", arr[i]);
        }
    
        return 0;
    }
    
    • 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

    优点

    • 不需要额外的内存空间,直接修改原数组。
    • 使用递归,可以将问题分解为更小的子问题,增加代码的可读性。

    缺点

    • 递归方法可能导致栈溢出,对于非常大的数组不适用。
    • 递归方法在某些情况下可能不如迭代方法高效。

    方法3: 使用临时数组实现

    思路

    1. 创建一个与原数组相同大小的临时数组。
    2. 从原数组的末尾开始,逐个将元素复制到临时数组的开头。
    3. 最终得到的临时数组就是原数组的逆序。
    4. 将临时数组的元素复制回原数组。

    代码

    #include 
    
    void reverseArray(int arr[], int length) {
        int temp[length];
    
        // 从原数组的末尾开始,逐个复制到临时数组
        for (int i = length - 1, j = 0; i >= 0; i--, j++) {
            temp[j] = arr[i];
        }
    
        // 将临时数组的元素复制回原数组
        for (int i = 0; i < length; i++) {
            arr[i] = temp[i];
        }
    }
    
    int main() {
        int arr[] = {1, 2, 3, 4, 5};
        int length = sizeof(arr) / sizeof(arr[0]);
    
        reverseArray(arr, length);
    
        printf("逆序数组: ");
        for (int i = 0; i < length; i++) {
            printf("%d ", arr[i]);
        }
    
        return 0;
    }
    
    • 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

    优点

    • 不修改原数组的顺序,逆序操作在临时数组上完成。
    • 算法简单,易于理解。

    缺点

    • 需要额外的内存空间来存储临时数组。
    • 有两次数组元素的复制操作,可能会降低性能。

    总结和推荐

    • 方法1(修改原数组实现)通常是最好的选择,因为它不需要额外的内存空间,直接修改原数组,适用于大多数情况。
    • 方法2(使用递归实现)可以增加代码的可读性,但对于大数组可能会导致栈溢出,不太适用。只有在递归深度不会很大的情况下才建议使用。
    • 方法3(使用临时数组实现)可以保持原数组不变,但需要额外的内存空间,并且有两次数组元素的复制操作,可能会降低性能。

    总的来说,方法1是最推荐的,因为它既高效又简单,不需要额外的内存空间。方法2和方法3在某些情

    况下也是合理的选择,取决于是否需要保持原数组不变或是否需要递归的可读性。

  • 相关阅读:
    C# 学习之路(C# 编程概述)
    12家硬件厂商发布飞桨生态发行版 软硬一体协同发展
    Nuxt脚手架nuxi初始化失败原因&解决方法
    Java 线程创建与常用方法
    [SWPU2019]Web3
    【vue2第十章】data数据与组件间通信
    SpringBoot+OAuth2+Spring Security+Redis+mybatis-plus+mysql+swagger搭建实现
    java中关于文件读写的各种类及其作用
    【算法】最优乘车——bfs(stringsteam的实际应用,getline实际应用)
    深度学习领域中的耦合与解耦
  • 原文地址:https://blog.csdn.net/2302_79769289/article/details/133693849