C语言编程中,经常需要对数组中的元素进行操作,其中一项常见任务就是计算数组中的最大值和最小值,五种常见的方法来计算数组中的最大值和最小值。每种方法都有其适用的场景和效率特点,在选择时需要根据具体情况进行权衡。

1、逐个比较法

一种直接的方法,遍历数组并逐个比较元素,记录最大值和最小值。

#include <stdio.h>

void findMinMax(int arr[], int size, int *min, int *max) {
    if (size <= 0) {
        return;
    }
    
    *min = arr[0];
    *max = arr[0];
    
    for (int i = 1; i < size; ++i) {
        if (arr[i] < *min) {
            *min = arr[i];
        }
        if (arr[i] > *max) {
            *max = arr[i];
        }
    }
}

int main() {
    int arr[] = {3, 7, -2, 10, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    int min, max;
    
    findMinMax(arr, size, &min, &max);
    
    printf("Minimum value: %d\n", min);
    printf("Maximum value: %d\n", max);
    
    return 0;
}

2、排序法

将数组排序,最小值为第一个元素,最大值为最后一个元素。

#include <stdio.h>
#include <stdlib.h>

int cmpfunc(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

void findMinMax(int arr[], int size, int *min, int *max) {
    if (size <= 0) {
        return;
    }
    
    qsort(arr, size, sizeof(int), cmpfunc);
    
    *min = arr[0];
    *max = arr[size - 1];
}

int main() {
    int arr[] = {3, 7, -2, 10, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    int min, max;
    
    findMinMax(arr, size, &min, &max);
    
    printf("Minimum value: %d\n", min);
    printf("Maximum value: %d\n", max);
    
    return 0;
}

3、分治法

将数组分成两部分,分别找出左半部分和右半部分的最小值和最大值,然后比较得出全局的最小值和最大值。

#include <stdio.h>

void findMinMax(int arr[], int low, int high, int *min, int *max) {
    int mid, min1, max1, min2, max2;
    
    if (low == high) {
        *min = arr[low];
        *max = arr[low];
        return;
    }
    
    if (high == low + 1) {
        if (arr[low] < arr[high]) {
            *min = arr[low];
            *max = arr[high];
        } else {
            *min = arr[high];
            *max = arr[low];
        }
        return;
    }
    
    mid = (low + high) / 2;
    findMinMax(arr, low, mid, &min1, &max1);
    findMinMax(arr, mid + 1, high, &min2, &max2);
    
    *min = (min1 < min2) ? min1 : min2;
    *max = (max1 > max2) ? max1 : max2;
}

int main() {
    int arr[] = {3, 7, -2, 10, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    int min, max;
    
    findMinMax(arr, 0, size - 1, &min, &max);
    
    printf("Minimum value: %d\n", min);
    printf("Maximum value: %d\n", max);
    
    return 0;
}

4、分别比较法

在一次遍历中同时找出最小值和最大值。

#include <stdio.h>

void findMinMax(int arr[], int size, int *min, int *max) {
    int i;
    
    if (size <= 0) {
        return;
    }
    
    if (size == 1) {
        *min = arr[0];
        *max = arr[0];
        return;
    }
    
    if (arr[0] < arr[1]) {
        *min = arr[0];
        *max = arr[1];
    } else {
        *min = arr[1];
        *max = arr[0];
    }
    
    for (i = 2; i < size; i++) {
        if (arr[i] < *min) {
            *min = arr[i];
        } else if (arr[i] > *max) {
            *max = arr[i];
        }
    }
}

int main() {
    int arr[] = {3, 7, -2, 10, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    int min, max;
    
    findMinMax(arr, size, &min, &max);
    
    printf("Minimum value: %d\n", min);
    printf("Maximum value: %d\n", max);
    
    return 0;
}

5、使用标准库函数

利用标准库函数 中的 INT_MININT_MAX 来初始化最小值和最大值,然后遍历数组更新。

#include <stdio.h>
#include <limits.h>

void findMinMax(int arr[], int size, int *min, int *max) {
    if (size <= 0) {
        return;
    }
    
    *min = INT_MAX;
    *max = INT_MIN;
    
    for (int i = 0; i < size; ++i) {
        if (arr[i] < *min) {
            *min = arr[i];
        }
        if (arr[i] > *max) {
            *max = arr[i];
        }
    }
}

int main() {
    int arr[] = {3, 7, -2, 10, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    int min, max;
    
    findMinMax(arr, size, &min, &max);
    
    printf("Minimum value: %d\n", min);
    printf("Maximum value: %d\n", max);
    
    return 0;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表