思路:运用分治的思想,将要排序的整个数组从中间劈开,分别求其左右两边的最大最小值,然后将求出的最大最小值合起来进行比较。
当左右两边的数组小到一定程度时:
(1)数组中只有一个元素,maxNum=minNum;
(2)数组中有两个元素,找出两个元素中的最大最小值;
6?
(3)数组中大于两个元素,从中间分开,继续递归;
1.分治
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
int arr[100];
void getMaxMin(int left,int right,int &maxNum,int &minNum)
{
if(left==right)
{
maxNum=arr[left];
minNum=arr[left];
return ;
}
else if(left+1==right)
{
maxNum=max(arr[left],arr[right]);
minNum=max(arr[right],arr[left]);
return ;
}
else
{
int mid=(left+right)/2;
int leftMax,leftMin,rightMax,rightMin;
getMaxMin(left,mid,leftMax,leftMin);
getMaxMin(mid+1,right,rightMax,rightMin);
maxNum=max(leftMax,rightMax);//左右两边最大值相比较,取最大的
minNum=min(leftMin,rightMin);//左右两边最小值相比较,取最小的
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
int maxNum,minNum;
getMaxMin(0,n-1,maxNum,minNum);
cout<<"最大值是:"<<maxNum<<" 最小值是:"<<minNum<<endl;
return 0;
}
2.迭代
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x;
cin>>n;
int a[n];
for(int i=0; i<n; i++)
cin>>a[i];
int max1=a[0],min1=a[0];
for(int i=0; i<n; i++)
{
if(a[i]>max1)
max1=a[i];
if(a[i]<min1)
min1=a[i];
}
cout<<min1<<" "<<max1<<endl;
}