数组最值查找,C语言必备技能,快速掌握!

在编程中,我们经常使用数组(列表)来存储给定的线性序列(例如 {1,2,3,4})。那么如何找到数组(序列)中的最大值或最小值呢?

查找数组(序列)中最大值或最小值的算法有很多种。接下来,我们以序列 {3,7,2,1} 为例,介绍两种查找最值的算法。一种是普通算法,另一种是利用分治算法解决。

普通算法

普通算法的解决思路如下:创建两个变量 max 和 min,分别用于记录数组中的最大值和最小值。它们的初始值都设置为数组中的第一个数字。

从第二个数字开始遍历数组,对于每个数字,如果它比 max 大,则将其赋值给 max 变量;如果它比 min 小,则将其赋值给 min 变量。继续遍历数组,直到遍历完整个数组,此时 max 中记录的就是数组中的最大值,min 中记录的就是数组中的最小值。

下面是普通算法对应的伪代码:

输入 num[1...n]              // 输入 n 个数字
max <- num[1]                // 将第 1 个数字赋值给 max(表示最大值)
min <- num[1]                // 将第 1 个数字赋值给 min(表示最小值)
for i <- 2 to n:            // 从第 2 个数字开始遍历
    if num[i] > max:        // 如果 max 小于遍历到的数字,则更新 max 的值//学习交流群:558970390
        max <- num[i]
    if num[i] < min:        // 如果 min 小于遍历到的数字,则更新 min 的值
        min <- num[i]
Print max , min              // 输出 max 和 min 的值

实现的过程很简单,有兴趣的小伙伴可以自行阅读源码。

分治算法

分治算法是一种用于找到最大值的方法。

在实现分治算法时,我们将数组不断地分割,直到每个分组中的元素数量≤2。由于每个分组内的元素最多有2个,因此很容易找到每个分组中的最值(最大值或最小值)。然后,我们将这些最值进行两两比较,最终得到整个数组的最值。

如上所述,在运用"分而治之"的思想下,我们将问题"找到{3, 7, 2, 1}中的最值"转化为先找出{3, 7]、[2, 1}各自的最值,然后再对这些最值进行比较,最终找到整个数组的最值。

下面是分治算法求数组中最大值的伪代码:

输入 arr[1...n]          // 输入 n 个数字
arr_max(x , y) :          // 设计一个递归函数,[x , y] 用来限定查找最大数的范围
    if y-x ≤ 1 :        // 如果 y-x 的值小于等于 1,则比较 arr[x] 和 arr[y] 的值,大的就是最大值
        return max(arr[x] , arr[y])
    else :
        // 将 [x , y] 区域划分为 [x , ⌊(x+y)/2⌋ ] 和 [ ⌊(x+y)/2+1⌋ , y] 两个区域,求出两个区域内各自的最大值
        max1 = arr_max(x , ⌊(x+y)/2⌋ )   
        max2 = arr_max( ⌊(x+y)/2+1⌋ , y)//领取代码、学习资料:558970390
    return max(max1 , max2)  // 比较两个区域的最大值,最终找出 [x , y] 中的最大值

分治算法实现“求数组中最大值”的 C 语言程序如下:

 
#include <stdio.h>
//自定义函数,其中 [left,right] 表示 arr 数组中查找最大值的范围
int get_max(int* arr, int left, int right) {
    int max_left = 0, max_right = 0, middle = 0;
    //如果数组不存在
    if (arr == NULL) {
        return  -1;
    }
    //如果查找范围中仅有一个数字
    if (right - left == 0) {
        return arr[left];
    }
    //如果查找范围中有 2 个数字,直接比较即可
    if (right - left <= 1) {
        if (arr[left] >= arr[right]) {
            return arr[left];
        }
        return  arr[right];
    }
    //等量划分成 2 个区域
    middle = (right - left) / 2 + left;
    //得到左侧区域中的最大值
    max_left = get_max(arr, left, middle);
    //得到右侧区域中的最大值
    max_right = get_max(arr, middle + 1, right);
    //比较左、右两侧的最大值,找到 [left,right] 整个区域的最大值
    if (max_left >= max_right) {
        return  max_left;
    }
    else {
        return max_right;
    }
}
int main() {
    int arr[4] = { 3,7,2,1 };
    int max = get_max(arr, 0, 3);
    printf("最大值:%d", max);
    return 0;
}

以上程序的输出结果均为:

最大值:7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值