c_cpp 使用最少比较次数的数组的最大值和最小值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 使用最少比较次数的数组的最大值和最小值相关的知识,希望对你有一定的参考价值。

/*
http://ideone.com/lgWZ20
http://www.geeksforgeeks.org/maximum-and-minimum-in-an-array/
http://www.practice.geeksforgeeks.org/problem-page.php?pid=85
*/
/*
approach does 3/2n -2 comparisons if n is a power of 2. And it does more than 3/2n -2 comparisons if n is not a power of 2.
*/

#include <iostream>
#include <string>
#include <vector>
using namespace std; 

struct MinMax {
	int min;
	int max;
};
struct MinMax getMinMax(int a[], int low, int high){
	struct MinMax minmax, left, right;
	
	if(low == high){
		minmax.max = a[low];
		minmax.min = a[low];
		return minmax;
	}
	if(high == low + 1){
		if(a[low] > a[high]){
			minmax.max = a[low];
			minmax.min = a[high];
		}else{
			minmax.max = a[high];
			minmax.min = a[low];
		}
		return minmax;
	}
	
	int mid = (high - low) / 2;
	left = getMinMax(a, low, mid);
	right = getMinMax(a, mid+1, high);
	
	if(left.min < right.min)
		minmax.min = left.min;
	else
		minmax.min = right.min;
		
	if(left.max > right.max)
		minmax.max = left.max;
	else
		minmax.max = right.max;
		
	return minmax;
}
int main() {
	int t, n;
	cin >> t;
	while(t--){
		cin >> n;
		int a[101];
		for(int i=0; i<n; i++)
			cin >> a[i];
		
		struct MinMax minmax = getMinMax(a, 0, n-1);
		cout << minmax.max << " " << minmax.min << endl;
	}
	return 0;
}
/*
http://ideone.com/nY3b3C
http://www.geeksforgeeks.org/maximum-and-minimum-in-an-array/
http://www.practice.geeksforgeeks.org/problem-page.php?pid=85
*/

#include <iostream>
#include <string>
#include <vector>
using namespace std; 

struct MinMax {
	int min;
	int max;
};
struct MinMax getMinMax(int a[], int n){
	struct MinMax minmax;
	
	if(n == 1){
		minmax.max = a[0];
		minmax.min = a[0];
		return minmax;
	}
	if(a[0] > a[1]){
		minmax.max = a[0];
		minmax.min = a[1];
	}else{
		minmax.max = a[1];
		minmax.min = a[0];
	}
	for(int i=2; i<n; i++){
		if(a[i] > minmax.max)
			minmax.max = a[i];
		else if(a[i] < minmax.min)
			minmax.min = a[i];
	}
	return minmax;
}
int main() {
	int t, n;
	cin >> t;
	while(t--){
		cin >> n;
		int a[101];
		for(int i=0; i<n; i++)
			cin >> a[i];
		
		struct MinMax minmax = getMinMax(a, n);
		cout << minmax.max << " " << minmax.min << endl;
	}
	return 0;
}

以上是关于c_cpp 使用最少比较次数的数组的最大值和最小值的主要内容,如果未能解决你的问题,请参考以下文章

最少交换次数

453. 最小移动次数使数组元素相等(数学)

求数组最大的前两个数,要求比较次数尽可能少

c_cpp 使用分而治之的方法查找未排序数组中的最小值和最大值

快速排序算法的最大和最小交换量

直接插入排序的比较次数移动次数和赋值次数 最小/最大/平均值