1. 程式人生 > >遞迴求最大最小值演算法 分治策略(c語言實現)

遞迴求最大最小值演算法 分治策略(c語言實現)

思路:運用分治的思想,將要排序的整個陣列從中間劈開,分別求其左右兩邊的最大最小值,然後將求出的最大最小值合起來進行比較。

當左右兩邊的陣列小到一定程度時:

(1)陣列中只有一個元素,maxNum=minNum;

(2)陣列中有兩個元素,找出兩個元素中的最大最小值;

(3)陣列中大於兩個元素,從中間分開,繼續遞迴;

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;

int arr[10];
void getMax_Min(int left,int right,int &maxNum,int &minNum){
	if(left==right){
		maxNum=arr[left];
		minNum=arr[left];
		return ;
	}else if(left+1==right){
		maxNum=arr[left]>arr[right]?arr[left]:arr[right];
		minNum=arr[left]>arr[right]?arr[right]:arr[left];
		return ;
	}else{
		int mid=(left+right)/2;
		int leftMax,leftMin,rightMax,rightMin;
		getMax_Min(left,mid,leftMax,leftMin);//遞迴找出左邊的最大最小值 
		getMax_Min(mid,right,rightMax,rightMin);//遞迴找出右邊的最大最小值 
		maxNum=max(leftMax,rightMax);//左右兩邊最大值相比較,取最大的 
		minNum=min(leftMin,rightMin);//左右兩邊最小值相比較,取最小的 
	}
}

int main(){
	for(int i=0;i<10;i++){
		arr[i]=rand();//生成隨機數 
		cout<<arr[i]<<" ";	
	}
	cout<<endl;
	int maxNum,minNum;
	getMax_Min(0,9,maxNum,minNum);
	cout<<"最大值是:"<<maxNum<<" 最小值是:"<<minNum<<endl;
	return 0;
} 
執行截圖: