/*分治法求最大元最小元*/
/*
思路:运用分治的思想,将要排序的整个数组从中间劈开,分别求其左右两边的最大最小值,然后将求出的最大最小值合起来进行比较。
当左右两边的数组小到一定程度时:(这个是先分再治,二分查找是边分边治)
(1)数组中只有一个元素,maxNum=minNum;
(2)数组中有两个元素,找出两个元素中的最大最小值;
(3)数组中大于两个元素,从中间分开,继续递归;
*/
#include<iostream>
using namespace std;
void get(int arr[],int left,int right,int &max,int &min)
{
if(left>=right)
{
max=arr[left];
min=arr[left];
return;
}else if(left+1==right){
max=arr[left]>arr[right]?arr[left]:arr[right];
min=arr[left]>arr[right]?arr[right]:arr[left];
return ;
}else{
int mid=(left+right)/2;
int leftMax,leftMin,rightMax,rightMin;
get(arr,left,mid,leftMax,leftMin);//递归找出左边的最大最小值
get(arr,mid+1,right,rightMax,rightMin);//递归找出右边的最大最小值
leftMax>=rightMax?max=leftMax:max=rightMax;//左右两边最大值相比较,取最大的
leftMin<=rightMin?min=leftMin:min=rightMin;//左右两边最小值相比较,取最小的
}
}
int main()
{
int arr1[]={1,4,6,5,7,3,1,0,4,7,1,5,9},arr2[]={1,4,6,5,7,3,1,0,4,7,1,5};
int len1=sizeof(arr1)/sizeof(int),len2=sizeof(arr2)/sizeof(int);
int max=arr1[0],min=arr1[0],left=0,right=len1-1;
get(arr1,left,right,max,min);
cout<<max<<" "<<min<<endl;
max=arr2[0],arr2[0];
get(arr2,left,right,max,min);
cout<<max<<" "<<min;
return 0;
}
分治法求最大元最小元
最新推荐文章于 2023-12-12 20:52:39 发布