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;
}