Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

输出一组数中最大和次大的数

Shelly, 2019-08-13 20:55:00 阅读数:10 评论数:0 点赞数:0 收藏数:0

第一种方法:

  采用排序,进行两趟冒泡排序,当数据基本有序(升序)且不要求按照原有数据中的顺序输出时可选择此方法 

 void select_1(int a[],int length,int *min1,int *min2){ 
     int i,j; 
     bool change = true; 
     for(i = ;i <=  && change;i++){ 
         change = false; 
         for(j = ;j < length - i;j++){ 
             if(a[j] > a[j+]){ 
                 int temp; 
                 temp = a[j]; 
                 a[j] = a[j+]; 
                 a[j+] = temp; 
                 change = true; //如果交换,说明没有排好序 
  } 
  } 
  } 
     
     *min1 = a[length - ]; 
     *min2 = a[length - ]; 
 } 

 

第二种方法:

  输出的数据按照原有数据中的顺序排列

 void select_2(int *x1,int *x2,int x){ 
     if(*x1 >= *x2){ 
         if(x > *x2){ 
             *x2 = x; 
  } 
  } 
     else{//x1 < x2
         if(x >= *x2){ 
             *x1 = *x2; 
             *x2 = x; 
  } 
         else if(x > *x1 && x < *x2){ 
             *x1 = *x2; 
             *x2 = x; 
  } 
  } 
 } 

 

测试数据:
  懒得输入,就直接初始化了

   注意:在第二次使用同一组数据时,需要重新输入或者定义另一个数组赋初值,切不可直接使用,因为冒泡排序已经改变了原有数据的顺序,也不可使用 a[10] = {2,3,1,4,7,3,5,1,6,0}; 这样的赋值语句,因为这种使用方式只有在初始化时可以这样写,在其他地方不可以,会出错,出错的原因是后面使用的不是初始化,并且a[10]表示一个值,而不是一组数,如果数组长度为10,a[10]是一个出界的数组值,也会导致出错。

 int main(){ 
     int a[] = {,,,,,,,,,}; 
     int b[] = {,,,,,,,,,}; 
     int min1,min2; 
     select_1(a,,&min1,&min2); 
     printf("不保证顺序,只是找出最大和次大的值\n"); 
     printf("min1: %d\nmin2: %d\n",min1,min2); 
     
     int i,j; 
     min1 = b[]; 
     min2 = b[]; 
     for(i = ;i < ;i++){ 
         select_2(&min1,&min2,b[i]); 
  } 
     printf("大小保持原有顺序不变\n"); 
     printf("min1: %d\nmin2: %d\n",min1,min2); 
     
     return ; 
 } 

 

输出结果截图:

 

版权声明
本文为[Shelly,]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/shelly-blog/p/11348496.html