问题描述
编写一个实验程序,随机产生10个1~20的整数,设计一个高效算法找其中的最大元素和最小元素,并统计元素之间的比较次数。 调用该算法执行十次并求元素的平均比较次数。
解题思路
a[0]为初始最大最小值,依次往后比较当前指向的数组值是否大于最大值或小于最小值。
最多比较次数: 9 * 2 = 18(a[0]为最大值)
最少比较次数: 9 (a[9]为最大值)
代码
#include<iostream>
#include <stdlib.h>
using namespace std;
int findMaxAndMin(){
int count=0;//比较次数
int maxc=0,minc=0;//最大最小值下标
int a[10];
for(int i=0;i<10;i++){//生成随机整数
a[i] = rand()%20 + 1;
}
int max=0,min=0;//最大最小值
for(int i=1;i<10;i++){
if(a[i] > max){//当前数组值与最大值时替换最大值
max = a[i];
maxc = i;
count++;//比较次数++
}else if(a[i] < min){//当前数组值与最小值时替换最小值
min = a[i];
minc = i;
count+=2;//比较次数+2(大于小于都比较了)
}else{
count+=2;//比较次数+2(大于小于都比较了)
}
}
cout<<"最大值:a["<<maxc<<"]="<<a[maxc]<<endl;
cout<<"最小值:a["<<minc<<"]="<<a[minc]<<endl;
cout<<"比较次数:"<<count<<endl;
return count;
}
int main(){
double count=0;
//调用十次
for(int i=0;i<10;i++){
count += findMaxAndMin();
}
cout<<"调用十次算法的平均比较次数:"<<count/10;
return 0;
}
运行结果: