算法导论之分治法

来源:互联网 发布:淘宝怎么搜索同城店铺 编辑:程序博客网 时间:2024/06/02 07:31

参考网址:这里写链接内容

#include<iostream>#include<math.h>using namespace std;// 返回跨越中值的最大数组和int* find_max_crossing_sub(int *arr, int low, int mid, int high){    int left_sum = INT_MIN;    int sum = 0;    int max_left = mid;    for (int i = mid; i >= low; i--)    {        sum += arr[i];        if (sum > left_sum)        {            left_sum = sum;            max_left = i;        }    }    int right_sum = INT_MIN;    sum = 0;    int max_right = 0;    for (int i = mid+1; i <= high; i++)    {        sum += arr[i];        if (sum > right_sum)        {            right_sum = sum;            max_right = i;        }    }    // cout << "左值下标:" << max_left << "右值下标:" << max_right << "总和:" << (left_sum + right_sum) <<endl;    int *data;    data = new int [3];    data[0] = max_left;    data[1] = max_right;    data[2] = left_sum + right_sum;    return data;}// 分治算法int* find_max_sub(int *arr, int low, int high){    if (high == low)    {        int *data = new int[3];        data[0] = low;        data[1] = high;        data[2] = arr[low];        return data;    } else    {        int *leftdata = new int[3];        int *rightdata = new int[3];        int *middata = new int[3];        int mid = int(floor((high + low)/2));        leftdata = find_max_sub(arr, low, mid);        rightdata = find_max_sub(arr, mid+1, high);        middata = find_max_crossing_sub(arr, low, mid, high);        if (leftdata[2] >= rightdata[2] && leftdata[2] >= middata[2])        {            return leftdata;        } else        {            if (rightdata[2] >= leftdata[2] && rightdata[2] >= middata[2])            {                return rightdata;            } else            {                return middata;            }        }    }}int main(){    int arr[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};    int *data = new int[3];    data = find_max_sub(arr, 0, 15);    cout << "左值下标:" << data[0] << "右值下标:" << data[1] << "总和:" << data[2] <<endl;    system("pause");    return 0;}
0 0
原创粉丝点击