设计一个c语言程序,用最少的比较次数,搜索整型数组中的最大和最小数

作者&投稿:承泊 (若有异议请与网页底部的电邮联系)
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。

可以看到这个问题他们其他人的程序共有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; }
}


用c语言编写一个温度计,程序要怎么写
程序如下:include <stdio.h> int main(){ int f;float c;printf("请输入一个华氏温度\\n");scanf_s("%d", &f);c = (float)(f - 32) * 5 \/ 9;printf("它的摄氏温度为:%.2f", c);} 如图:调试通过:

编写一个C语言程序,计算20个学生的某门功课的平均成绩、标准差,找出...
define N 5 void main(){ float Score[N];\/\/成绩 float Ave;\/\/平均成绩 double Var;\/\/标准差 float Max;\/\/最大值 float Min;\/\/最小值 int i;float Sum=0;\/\/和 float cout=0;\/\/计数器 printf("输入某门成绩(1-20)");for (i = 0; i < N ; i++)\/\/循环输入20个数据 { ...

如何用C语言编写一个简单的计时器程序?
直接编译,程序输出结果中任意输入三个数字,程序执行结果如下图所示:

如何用C语言编写这个计数程序?
按照题目要求编写的C语言计数程序如下 include<stdio.h> int main(){ int i,start,end,step;printf("从哪个数字开始计数:");scanf("%d",&start);printf("在哪个数字停止计数:");scanf("%d",&end);printf("每次增加的数字:");scanf("%d",&step);for(i=start;i<=end;i=i+step){ print...

如何用C语言编写一个程序,输入10个0-9之间的整数,请统计每个数字出现的...
int num[10],count[10], i=0,temp;\/\/判断输入的数字是否是0到9之间的数 int input(int num){ if(num>=0&&num<=9){ return 1;}else{ return 0;} } \/\/初始化计数的数组 void initCount(){ int i = 0;for(i=0;i<10;i++){ count[i]=0;} } \/\/统计每个数字出现的次数 void...

编写一个C语言程序:从键盘读入一行文本,统计每个英文字母出现的次数_百 ...
1、循环读取字符,直到换行为止。对于每个字符,执行以下流程。2、判断是否为英文字母,即小写和大写两种。3、如果是英文字母,则统计个数。输入部分,可以存为数组,也可以每输入一个字符计算一次。二、参考代码:include <stdio.h>int main(){ int c; int cnt[52]={0}; while((c=get...

编写一个C语言程序:输入4个学生4门课的成绩,计算各科不及格的人数? 怎 ...
定义一个整型数组c[4]来作为科目不及格计数器,代码如下 include<iostream> using namespace std;int main(){ int i,j,b[4][4];static int c[4]={0,0,0,0};for (i=0;i<4;i++)for (j=0;j<4;j++)cin>>b[i][j];for (i=0;i<4;i++){for (j=0;j<4;j++)cout<<"...

如何用C语言编写一个计数的程序?
while(1){ P0=0x55;P1=0x01; \/\/奇数亮 delay(500); \/\/500ms P0=0; P1=0; \/\/全部熄灭 delay(200); \/\/200ms P0=~P0; P1=~P1; \/\/偶数亮 delay(1000); \/\/1000ms P0=0; P1=0; \/\/全部熄灭 delay(200); \/\/200ms } ...

求一个C语言的黑白棋程序
#define ESC 0x011b \/* ESC键值*\/#define ENTER 0x1c0d \/* 回车键值*\/int a[8][8]={0},key,score1,score2;\/*具体分数以及按键与存放棋子的变量*\/char playone[3],playtwo[3];\/*两个人的得分转换成字符串输出*\/void playtoplay(void);\/*人人对战函数*\/void DrawQp(void);\/*画棋盘函数*\/...

C语言:编写一个程序,接受一个用户输入的一行字符,按回车结束
char str[100],*p;int cout[4]={0};scanf("%[^\\n]",&str);p=str;while(*p){ if((*p>='A'&&*p<='Z')||(*p>='a'&&*p<='z'))cout[0]++;else if(*p==' ')cout[1]++;else if(*p>='0'&&*p<='9')cout[2]++;else cout[3]++;p++;} printf("\\nletter=%d,blank...

张店区13736008283: 设计一个c语言程序,用最少的比较次数,搜索整型数组中的最大和最小数 -
愚娴巴曲: 可以看到这个问题他们其他人的程序共有n-1趟循环,每趟循环进行2次比较,共有2*n - 2次比较.如果从尽可能减少比较操作次数来提高性能的角度出发,他们的程序并不是最优的,其实对n个数的数列,同时找出他们的最小值和最大值,最少...

张店区13736008283: c语言编程 -
愚娴巴曲: 设原来袋中最重的金块为M1,第二重的金块为M2,最轻的金块为m1,第二轻的金块是m2.(假设第二重的,和第二轻的只是为了老板以后发工资方便.) 如果有N块金块加入袋中(每块的重量都不相等,因为每块的重量都不相等,所以比较的次...

张店区13736008283: C语言 怎样设计一个比较3个数的大小的程序 急急急!!!
愚娴巴曲: #include <stdio.h> int main() { int a, b, c; scanf("%d%d%d", &a, &b, &c); printf("\nmax = %d, min = %d", (a>b)?(a>c?a:c):(b>c?b:c),(a<b)?(a<c?a:c):(b<c?b:c)); return 0; }

张店区13736008283: c语言比较abc大小怎么做是完整的? -
愚娴巴曲: // 从大到小输出三个整数 #include <stdio.h> int main() { int a,b,c; printf("请输入三个整数(逗号隔开): "); scanf("%d,%d,%d",&a,&b,&c); if(a > b) { if(b > c) printf("%d %d %d\n\n",a,b,c); else if(a > c) printf("%d %d %d\n\n",a,c,b); ...

张店区13736008283: 菜鸟提问,用C语言编一个能比较三个数大小的程序??? -
愚娴巴曲: #include<stdio.h> int main() { float a,b,c,t; printf("请输入3个数abc\n“); scanf("%f%f%f",&a,&b,&c); if(a>b) t=a; else t=b; if(t>c) printf("最大值为%f",t); else printf("最大值为%f",c); return 0; }

张店区13736008283: C语言程序设计中如何比较三个数的大小 -
愚娴巴曲: 思路:比较三个数的大小可以先求出最大值和最小值,这样中间数就是三个数的和减去最大数和最小数. 参考代码: #include int main() { int a,b,c,max,min; scanf("%d%d%d",&a,&b,&c); max=(a>b?a:b)>c?(a>b?a:b):c; min=(a printf("三个数按从小到大顺序为:%d %d %d\n",min,a+b+c-min-max,max); return 0; } /* 输出: 8 1 6 三个数按从小到大顺序为:1 6 8 */

张店区13736008283: 1、一个C语言程序是由( ). -
愚娴巴曲: 一个C程序由一个主函数和若干个其他函数组成.若干个的意思就是可以有0个及以上个.c语言的程序模块称为函数. C 语言可以进行多种方式进行程序的设计,它是一种很有特色的高级语言通过若干个函数组成,它具备构成程序设计的 3 种基...

张店区13736008283: c语言程序设计,编写一段小程序
愚娴巴曲:#include<stdio.h> int main() { int a[20][8]; /定义二维数组a 有20个元素存储20个选手,每个元素有8个二维元素 ,存储8个得分 int i,j; float max,min,n=0,m; printf(" 请输入得分 \n"); / 提示输入分数 for(i=0;i<20;i++) { for(j=0;j<8;j++) scanf("%f...

张店区13736008283: 那么,我们如何学好《C程序设计》呢? -
愚娴巴曲: 一.学好C语言的运算符和运算顺序 学好《C程序设计》的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言.在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初...

张店区13736008283: c程序设计应该怎么学?
愚娴巴曲: 在初学C语言时,可能会遇到有些问题理解不透,或者表达方式与以往数学学习中不同(如运算符等),这就要求不气馁,不明白的地方多问多想,鼓足勇气进行学习,待学完后面的章节知识,前面的问题也就迎刃而解了,这一方面我感觉是我...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网