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 使用分而治之的方法查找未排序数组中的最小值和最大值
快速排序算法的最大和最小交换量
直接插入排序的比较次数移动次数和赋值次数 最小/最大/平均值