图 1 数组中找最大值的过程
输入 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 的值 max <- num[i] if num[i] < min: // 如果 min 小于遍历到的数字,则更新 min 的值 min <- num[i] Print max , min // 输出 max 和 min 的值
图 2 分治算法找最大值
输入 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) return max(max1 , max2) // 比较两个区域的最大值,最终找出 [x , y] 中的最大值
#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; }
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); } }
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='')
最大值:7
本文链接:http://task.lmcjl.com/news/18712.html