分治算法找数组的最大值

分治算法找数组的最大值,第1张

分治算法找数组的最大值

分治算法,我的算法老师和我们讲分治算法的时候,讲了春秋战国后期,秦统一全国的事——合纵连横。

普通算法的伪代码:

 分治算法伪代码:

用C语言实现:

#include 
//自定义函数,其中 [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;
}

 用Java语言实现:

public class Demo {
    public static int get_max(int [] arr,int left,int right) {
        //如果数组不存在或者数组内没有元素
        if (arr == null || arr.length == 0) {
            return -1;
        }
        //如果查找范围中仅有 2 个数字,则直接比较即可
        if(right - left <=1) {
            if(arr[left] >= arr[right]) {
                return arr[left];
            }
            return arr[right];
        }
        //等量划分成 2 个区域
        int middle = (right-left)/2 + left;
        int max_left = get_max(arr,left,middle);
        int max_right = get_max(arr,middle+1,right);
        if(max_left >= max_right) {
            return max_left;
        }else {
            return max_right;
        }
    }
    public static void main(String[] args) {
        int [] arr = new int[] { 3,7,2,1 };
        int max = get_max(arr,0,3);
        System.out.println("最大值:"+max);
    }
}

用python语言实现:

def get_max(arr,left,right):
    #列表中没有数据
    if len(arr) == 0:
        return -1
    #如果查找范围中仅有 2 个数字,则直接比较即可
    if right - left <= 1:
        if arr[left] >= arr[right]:
            return arr[left]
        return arr[right]
    #等量划分成 2 个区域
    middle = int((right-left)/2 + left)
    max_left = get_max(arr,left,middle)
    max_right = get_max(arr,middle+1,right)
    if max_left >= max_right:
        return max_left
    else:
        return max_right
arr = [3,7,2,1]
max = get_max(arr,0,3)
print("最大值:",max,sep='')

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5594876.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存