分治理法求數組最大值,分治理法數組
現在給出一個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];
}
};