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_MIN
和 INT_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; }