分治理法求數組最大值,分治理法數組

來源:互聯網
上載者:User

分治理法求數組最大值,分治理法數組

現在給出一個n個元素的書組,元素個數n,需要求出最大最小值.

方法1.

用max,min,分別記錄數組最大最小值,順序掃描數組,不斷替換更新max,min,(max,min的初始值都為數組中的第一個元素)

方法2.

1.如果數組中只有一個元素,那麼它是最大也是最小值

2.否則數組中多餘一個數,則可以求出左邊的最大最小值,右邊的最大最小值.然後該區間的最大值是max(lmax,rmax),最小值是min(lmin,rmin)

具體如下(n個數字由隨機產生).

#include <stdio.h>#include <time.h>int getmax(int a,int b){        return a>b?a:b;}int getmin(int a,int b){        return a<b?a:b;}void print(int a[],int n){        int i;        for(i=0;i<20;i++)                printf("%d ",a[i]);        printf("\n");}void maxmin(int a[],int l,int r,int * _max,int * _min){        if(r>l){               int m=(l+r)/2;               int _lmin,_rmin,_lmax,_rmax;                maxmin(a,l,m,&_lmax,&_lmin);                maxmin(a,m+1,r,&_rmax,&_rmin);               *_max=getmax(_lmax,_rmax);               *_min=getmin(_lmin,_rmin);        }else{        *_max=*_min=a[l];        }}int creat(int a[],int n,int m){        int i;        srand(time(NULL));        for(i=0;i<n;i++)                a[i]=rand()%m-m/2;        return n;     }int main(){        int n,i;        int a[100];        int _min,_max;        creat(a,20,100);        print(a,20);        maxmin(a,0,19,&_max,&_min);        printf("max:%d min:%d\n",_max,_min);        return 0;}
下面是幾次啟動並執行結果.



怎用c++的分治法數組最大最小值

www.cppblog.com/...5.html
演算法思想:先相鄰兩個兩個比較,較大的放入數組max[],較小的放入數組min[],然後從max[]數組求出最大,min[]數組求出最小即可。 可以證明這是效率最高的演算法,不能進一步改進。

#include <iostream>
#define n 11
#define m ((n+1)/2)
using namespace std;

void main(void)
{
int num[] = {11,2,3,4,6,5,7,8,9,10,20};
//int n = sizeof(num)/sizeof(num[0]);
//int m = (n+1)/2;
int max[m] , min[m];
int k = 0, j = 0;

if(n/2 != 0) max[m-1] = min[m-1] = num[n-1];

for (int i=0; i < n-1; i = i+2)
{
if (num[i] >= num[i+1])
{
max[j++] = num[i];
min[k++] = num[i+1];
}
else
{
max[j++] = num[i+1];
min[k++] = num[i];
}

}

for( i=0; i< m; i++)
{
cout << "max[" << i << "] = " << max[i] << "\t";
cout << "min[" << i << "] = " << min[i] <<endl;
}

int MAX = max[0];
int MIN = min[0];

for ( j = 1; j < m; j++)
{
if (max[j] > MAX) MAX = max[j];
if (min[j] < MIN) MIN = min[j];
}

cout << "MAX = " << MAX << ", MIN = " << MIN <<endl;
}
 
C/C++分治法:一個數組中的兩個最大值與兩個最小值 :會的來吧 寫了

int max=0;
int min=0;
void max_num(int* number,int first,int last)
{
if(first+1<last)
{
int i=(first+last)/2;
max_num(number,first,i);
max_num(number,i+1,last);
}
else if(first+1==last)
{
if(number[first]>number[last])
{
max=max>number[first]?max:number[first];
min=min<number[last]?min:number[last];
}
else if(number[first]<number[last])
{
max=max>number[last]?max:number[last];
min=min<number[first]?min:number[first];
}
}
else if(first==last)
{
max=max>number[first]?max:number[first];
min=min<number[last]?min:number[last];
}
};
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.