设计一个c语言程序,用最少的比较次数,搜索整型数组中的最大和最小数 从n个数里面找最大的两个数理论最少需要比较多少次

作者&投稿:彘泻 (若有异议请与网页底部的电邮联系)
可以看到这个问题他们其他人的程序共有n-1趟循环,每趟循环进行2次比较,共有2*n - 2次比较。如果从尽可能减少比较操作次数来提高性能的角度出发,他们的程序并不是最优的,其实对n个数的数列,同时找出他们的最小值和最大值,最少的比较次数可做到3 * n / 2,这个次数是小于2*n-2的。算法的思路是: 将该列数每相邻两个分成一组,得出每组的较大者和较小者,这里进行了n / 2次比较,然后把各组的较大者放在一块找出它们的最大者即可得到全体中的最大元,这里将有(n / 2) - 1次比较(因为共分成n / 2组,因此是在n/2个数中选出最大值,所以需要n/2-1次比较),同理在n/2个较小者中选出最小值需要n/2-1次比较。所以这种算法大约需要3*n/2次比较,算比较快的了。实现时,将每相邻的两个元素分成一组,然后一组一组处理,例如下标为0的与下标为1为第1组,下标为2的与下标为3的为第2组,...下标为2i与下标为2i+1的为第i组,Max用于存储前i组中已决出的最大元,Min用于存储前i组中已决出的最小元,max用于表示第i组中的较大元,min表示第i组中的较小元,在处理第i组前,Max为前2(i - 1)个元素中的最大元,Min为前2(i - 1)个元素中的最小元,则处理第i组时,先比较a[2*i]与a[2*i+1],较大者为max,较小者为min,然后再将Max与max比较,其中较大的为前2i个元素中的最大者,再将Min与min比较,较小的即为前2i个元素中的最小者,当i为第n/2组时(即最后一组)结束:
bool find_MinMax(int a[], int n, int &Max, int &Min) { //从n个数中找出最大值Max与最小值Min
int max, min, i;
if(n < 1) return false; /*如果是空列,则返回失败*/
if(n == 1){ /*如果只有一个元素,则这个元素既是最大元又是最小元*/
Max = a[0], Min = a[0];
return true;
}
if(a[0] > a[1]) { /*先假定a[0]与a[1]中的较大元为最大元、较小元为最小元*/
Max = a[0], Min = a[1];
}
else {
Max = a[1], Min = a[0];
}
for(i = 1; 2 * i < n - 1; i++) {/*然后每两个为一组进行处理*/
if(a[2 * i] > a[2 * i + 1]) {
max = 2 * i, min = 2 * i + 1;
}
else {
max = 2 * i + 1, min = 2 * i;
}
if(a[max] > Max) Max = a[max];
if(a[min] < Min) Min = a[min];
}
if(n % 2) { //如果元素总个数为奇数,则处理最后的这个落单的元素
if(a[n - 1] > Max) Max = a[n - 1];
else if(a[n - 1] < Min) Min = a[n - 1];
}
return true;
}

int arr[6]={2,3,45,6,78};
int max=arr[0];
int min=arr[0];
for(int i=0;i<6;i++)
{
if(max<arr[i])max=arr[i];

if(min>arr[i])min=arr[i];
}
printf......
更多交流参考我空间文章。

如果数组中的值没有规律,这个恐怕没有太好的办法,只有从头到尾比较一遍。
int max = a[0];
int min = a[0];
for( i = 1; i < N; ++i )
{
int tmp = a[i];
if ( tmp > max ){ max = tmp; }
if ( tmp < min ){ min = tmp; }
}

NOIP2014 同时查找2n个数中的最大值和最小值,最少比较次数为( )。 A. 3(n-2)/2 B. 4n-2 C. 3n-2 D. 2n-2~

前两个数比较,大的为最大值, 小的为最小值, 用掉一次比较
后面2*(n-1)个数, 每两个比较, 大的同最大值比较, 小的同最小值比较, 3*(n-1)次比较,
共3*(n - 1) + 1 = 3n - 2次比较

从n个数里面找最大的两个数理论最少需要比较的次数为:n+ logn -2
解析一:类似比赛晋级,两两配对比较,赢的再两两配对,最后得到冠军(最大的数),可以看成是一棵二叉树,以4人为例:

0


0 2


0 1 2 3


可以看出,找出最大的数比较次数是n-1。然后第二大的数肯定是跟冠军比较过的数字,那么很明显每一层都有一个,所以有logn-1次比较。 所以总共是n+logn-2次比较。
解析二:冒泡法找最大比较次数为n-1,然后再在之前每一次比较的结果里面找第二大的数,比较的次数为logN,需要减去最后一次最大数的比较,即求第二个数是logN-1,结果就是n+ logn -2。

求编写一个C语言的程序
答:include<stdio.h>#include#include<stdlib.h>#define N 10void main(){srand((int)time(NULL));//随机数种子struct Student{char name[20];//int num;};int i=0,num,a,b,c,j;Student stu[10],st;printf("请输入10名竞选者的名字\n");for(i=0;i<10;i++){scanf("%s",stu[i]...

用C语言写一个很简单的程序,输入两个整数a,b,要求输入a-b的值,例如...
答:include<stdio.h> main(){ int a,b;printf("请输入A和B:");scanf("%d%d",&a&b);printf("a-b的差为:%d",a-b);}

求c语言程序:用一个函数求N个数的最大值和最小值。。。
答:int min;int maxmin(int n){int i,x,f;scanf("%d",&f);min=f;for(i=1;i<n;i++){scanf("%d",&x);if(x>f)f=x;else if(x<min)min=x;} return f;} int main(){int n,mm;printf("有几个数:");scanf("%d",&n);mm=maxmin(n);printf("其中最大的数是:%d\n最小...

用C语言编一程序,输入三个整数,输出其中最小的数
答:可以参考以下的代码:include <stdio.h> void main(){ int a,b,c,min;scanf("%d%d%d",&a,&b,&c);min=a;if(min>b) min=b;if(min>c) min=c;printf("min=%d\n",min);}

设计一个C语言程序, 从键盘上输入a,b,c三个整数,输出其中的最小者
答:include<stdio.h> void main(){ int a,b,c;scanf("%d%d%d",&a,&b,&c);//从键盘上输入a,b,c三个整数 if(a<b){ if(a<c)printf("%d",a);//输出其中的最小者 else printf("%d",c);//输出其中的最小者 } else { if(b<c)printf("%d",b);//输出其中的最小者 else prin...

...你当玩家的21点游戏这是一个C语言程序,跪求C语言大神解答!!!_百度...
答:if(player_card[i]>1 && player_card[i]<10) //输出玩家抽到的牌的点数 printf("您抽到的第%d张牌是%d\n",i+1,player_card[i]);else if(player_card[i]==10)printf("您要到的第%d张牌是%c\n",i+1,player_ch);else printf("您要到的第%d张牌是A\n",i+1);if(player_...

用c语言编写程序
答:include<iostream.h> void main(){ double a;double b;cout <<"输入账单:";cin >> a;if(a<=100)b = 10;if(a>100)b = a/10;cout<<"小费:"<< b <<endl;}

用c语言编写一个程序
答:应该多给几个例子,n=10的时候如何处理?得到10,110,210,1210等等?若是这样的,试试下面程序:/ 用c语言编写一个程序:对于一个自然数n(n<=50),统计具有下列数字的个数,并输出所有符合条件的数字:自然数n,在n的左边加上一个自然数,但该自然数不能超过原数的一半;继续按此规则进行处理,...

c语言 利用排序程序求十个数中最大值和最小值的差
答:if((a[j]-a[j+1])>0.0001)//浮点类型的数不能直接比较大小,因为精度问题,所以设置一个精度值 { temp=a[j];a[j]=a[j+1];a[j+1]=temp;} } } int main(){ float max,mix;float a[10];input(a,10);//调用输入函数 sort(a,10);//调用排序函数 max=a[9];//最大值是...

如何用C语言写程序:输入一个长度小于100的字符串,统计标点符号个数...
答:在英文字符中,只要不是空格数字或字母,就都属于是标点或符号的范围,所以这样的话,整个程序就比较好写了:include<stdio.h> istdio.<ctype.h> int main(){ int n=0;char c;while((c=getchar())!='\n')if(c!=' '&&!isalnum(c))n++;printf("%d\n",n...