分治法的经典问题——求数列中最大最小值

    xiaoxiao2021-12-14  17

    前面我们已经了解了分治法的原理和使用,分治法的经典问题——大整数相乘,趁热打铁,来学习一下如何使用分治法来求数列中的最大最小值。

    利用分治法来分析

    伪代码

    时间复杂性

    代码实现

    #include<cstdio> #include<cstdlib> #include<cmath> using namespace std; int* getmaxmin(int a, int b){ int* m = new int[2]; if(a < b){ m[0] = a; m[1] = b; }else{ m[0] = b; m[1] = a; } printf("getmaxmin的值:%d, %d\n", m[0], m[1]); return m; } //m[0]存放最小值,m[1]存放最大值 int* maxmin(int a[], int n1, int n2){ if((n2 - n1 + 1)== 1){ int* m = new int[2]; m[0] = -1; m[1] = a[n2]; return getmaxmin(a[n2], a[n2]); }else if((n2 - n1 + 1) == 2){ return getmaxmin(a[n1], a[n2]); }else{ int k = n1 + (n2 - n1) / 2; int* lm = maxmin(a, n1, k); int* rm = maxmin(a, k+1, n2); printf("lm得到的值:%d, %d\n", lm[0], lm[1]); if(rm[0] == -1){ printf("rm得到的值:%d\n", rm[1]); } printf("rm得到的值:%d, %d\n", rm[0], rm[1]); int* result = new int[2]; if(lm[0] < rm[0]){ result[0] = lm[0]; }else{ result[0] = rm[0]; } if(lm[1] < rm[1]){ result[1] = rm[1]; }else{ result[1] = lm[1]; } return result; } } int main(){ int a[8] = {6,10,32,8,19,20,2,14}; int* result = maxmin(a, 0, 7); printf("最大值为:%d,最小值为:%d", result[1], result[0]); }

    结果如下:

    转载请注明原文地址: https://ju.6miu.com/read-971362.html

    最新回复(0)