急死我了机试之基于score为主要排序、no为次要排序的结构体数组冒泡排序变式

本文介绍了如何使用C语言中的typedef定义结构体,结合冒泡排序算法解决一个竞赛题目。重点在于理解如何处理结构体数组,确保主要按score排序,同时no保持不变。通过两次冒泡排序实现主要和次要关键字的先后排序。
摘要由CSDN通过智能技术生成

nowcoder原题链接

0.复习差不多的基础知识

  • typedef 定义结构体。本题需使用结构体数组。
  • 冒泡排序。本题需要进行两次冒泡在,score为主要排序关键字,no为次要关键字。
  • if-if、if-else if的执行顺序理解与选择。本题为嵌套的主次判断,故选择if-if。
  • ==是判断是否相等,容易出错。

1.正文

1.0题干分析

这题拿起来简单,但是做起来却发现有很多出错点。
Stage 1:
确定使用(1)结构体数组(2)BubbleSort
写完查看测试实例,发现原来score前的no也得一起交换,只是输出按照分数升序排列。
故Stage 2:
key:怎么解决排序后no变换的问题->直接整个数组单元交换
这就是本题使用结构体数组的意义:(1)方便输出 (2)保证按照score排序,但是no不变。
Stage 3:
给出的测试有类似于:
3
8 30
4 40
2 40
希望输出的是:
2 40
4 40
8 30

明白了题目要求的是主要排序为score、次要排序为no。很自然会联想到应该使用两次冒泡排序,且二者的关系是先后次序,所以用嵌套判断的if- if语句,不是if else if的分支判断语句。

完整代码

#include <stdio.h>

#define Nmax 100

typedef struct{

    int no;
    int score;

}Stu;

//1.结构体数组
//2.BubbleSort
//3.发现no也要一起换,只是输出按照分数升序排列
//key:怎么解决排序后no变换的问题->直接整个数组单元交换
//这就是使用数组的意义(1)方便输出 (2)保证按照score排序,但是no不变


//题目要求主要排序为score、次要排序为no
//是先后次序,所以用if if语句,不是if else if

void Bubblesort(Stu pstu[],int N){
	int i,j;
	Stu tmp;
	//进行N-1次冒泡
	for(i=0;i<N-1;i++){
		//进行N-1-i次交换
		//题目要求升序
		for(j=1;j<=N-1-i;j++){
			if(pstu[j-1].score>=pstu[j].score){
				//先主要排序
				tmp=pstu[j];
				pstu[j]=pstu[j-1];
				pstu[j-1]=tmp;
				//再次要排序,注意==才是相等
				if(pstu[j-1].score==pstu[j].score&&pstu[j-1].no>pstu[j].no){
					tmp=pstu[j];
					pstu[j]=pstu[j-1];
					pstu[j-1]=tmp;
				}
				
			}

		}
	}
	
}


int main() {
    int N,i;
    Stu students[Nmax];
//1. input
    scanf("%d",&N);

    for(i=0;i<N;i++){
        scanf("%d %d",&students[i].no,&students[i].score);
    }
//2.Bubblesort
	Bubblesort(students,N);
//3.printf
	for(i=0;i<N;i++){
        printf("%d %d\n",students[i].no,students[i].score);
    }



    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周树皮不皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值