美文网首页
选最大与最小(分治法)

选最大与最小(分治法)

作者: 张的笔记本 | 来源:发表于2019-11-24 22:23 被阅读0次
struct Max_Min{//max & min和与之对应的下标值
    int max_i, min_i;
};
/*思路:
 *  将数组均分为两个,分别找到两个数组中的最大值与最小值。递归分治。
 * 再比较这两个数组分别得到的最大值得出最大值,最小值同理。
 */ 
Max_Min Find_Max_and_Min(int *array, int begin, int end)
{
    int n = end - begin + 1;
    if(n == 1){
        Max_Min max_min;
        max_min.max_i = max_min.min_i = begin;      
        return max_min;
    }
    if(n == 2){
        Max_Min max_min;
        if(array[begin] >= array[end]){
            max_min.max_i = begin;
            max_min.min_i = end;
        }
        else{
            max_min.max_i = end;
            max_min.min_i = begin;
        }
        return max_min;
    }
    else if(n % 2){//奇
        int temp = (n - 1) / 2;
        Max_Min max_min, max_min1, max_min2;
        max_min1 = Find_Max_and_Min(array, begin, begin + temp - 1);
        max_min2 = Find_Max_and_Min(array, begin + temp, end - 1);
        //存在1轮空元素
        //比较大小
        if(array[max_min1.max_i] >= array[max_min2.max_i]){
            if(array[max_min1.max_i] >= array[end])
                max_min.max_i = max_min1.max_i;
            else
                max_min.max_i = end;
        }
        else{
            if(array[max_min2.max_i] >= array[end])
                max_min.max_i = max_min2.max_i;
            else
                max_min.max_i = end;
        }
        if(array[max_min1.min_i] < array[max_min2.min_i]){
            if(array[max_min1.min_i] < array[end])
                max_min.min_i = max_min1.min_i;
            else
                max_min.min_i = end;
        }
        else{
            if(array[max_min2.min_i] < array[end])
                max_min.min_i = max_min2.min_i;
            else
                max_min.min_i = end;
        }
        return max_min;
    }
    else{//偶
        Max_Min max_min, max_min1, max_min2;
        max_min1 = Find_Max_and_Min(array, begin, begin + n / 2 - 1);
        max_min2 = Find_Max_and_Min(array, begin + n / 2, end);
        //比较大小
        if(array[max_min1.max_i] >= array[max_min2.max_i])
            max_min.max_i = max_min1.max_i;
        else
            max_min.max_i = max_min2.max_i;
        if(array[max_min1.min_i] < array[max_min2.min_i])
            max_min.min_i = max_min1.min_i;
        else
            max_min.min_i = max_min2.min_i;
        return max_min;
    }
}

原理参见 屈婉玲老师 算法设计与分析 ORZ

相关文章

  • 选最大与最小(分治法)

    原理参见 屈婉玲老师 算法设计与分析 ORZ

  • 分治策略

    求解递归式方法 最大子数组问题 分治策略 分治法流程 伪代码 C++实现 线性解 流程 代入法求解递归式 递归树法...

  • 算法笔记

    分治算法 解决问题: 大整数乘法(O(n^1.59)) 最大值与最小值(O(3/2*n - 1)) 从n个元素的数...

  • 第四章 分治策略

    本章介绍分治法,首先通过前两节最大子数组、矩阵乘法两个问题说明分治法的一般步骤:分解,解决,合并。当子问题需要递归...

  • 算法

    计算复杂度换算表 分治法 碰到复杂度为 n^2的应该立即想到使用分治法将复杂度降为 nlogn级别e.g 求最大连...

  • Divide and Conquer

    算法之 分治法 Divide and Conquer 分治法: 分治法的设计思想是:将一个难以直接解决的大问题,分...

  • 归并排序

    1、分治法 归并排序是完全遵循分治策略的排序算法。什么是分治法? 分治法,即将原问题分解为几个规模较小的子问题,递...

  • 分治法,动态规划及贪心算法区别

    原文:分治法,动态规划及贪心算法区别 1.分治法 分治法(divide-and-conquer):将原问题划分成n...

  • 算法理论 | 分支限界法

    分支限界法 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树 分支限界法与回溯法的区别 ...

  • 算法-二分查找法

    二分查找法的原理: 让最大数与最小数的中间数不断与目标数字比较,然后不断缩小最大值和最小值的范围,直到范围缩小到1...

网友评论

      本文标题:选最大与最小(分治法)

      本文链接:https://www.haomeiwen.com/subject/vqprwctx.html