C语言输出数组中最大和次大的数

码农公社  210.net.cn   210= 1024  10月24日一个重要的节日--码农(程序员)节

第一种方法:    

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


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


第二种方法:    

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


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[10] = {2,3,1,4,7,3,5,1,6,0};
    int b[10] = {2,3,1,4,7,3,5,1,6,0};
    int min1,min2;
    select_1(a,10,&min1,&min2);
    printf("不保证顺序,只是找出最大和次大的值\n"); 
    printf("min1: %d\nmin2: %d\n",min1,min2);
    
    int i,j;
    min1 = b[0];
    min2 = b[1];
    for(i = 2;i < 10;i++){
        select_2(&min1,&min2,b[i]);
    }
    printf("大小保持原有顺序不变\n"); 
    printf("min1: %d\nmin2: %d\n",min1,min2);
    
    return 0;
}

输出结果截图:

1.jpg



源自https://www.cnblogs.com/shelly-blog/p/11348496.html

评论