优化 这段代码 #include<stdio.h> #include<malloc.h> struct information{ int id,grades; }; int main( ){ int n,m,grades; scanf("%d %d",&n,&m); m*=1.5; struct information*p=(struct information*)malloc(n*sizeof(struct information)); struct information q; for(int i=0;i<n;i++) scanf("%d %d",&p[i].id,&p[i].grades); for(int i=0;i<n;i++) for(int j=0;j<n-1;j++){ if(p[j].grades<p[j+1].grades) { q=p[j]; p[j]=p[j+1]; p[j+1]=q; }else if(p[j].grades==p[j+1].grades) if(p[j].id>p[j+1].id) { q=p[j]; p[j]=p[j+1]; p[j+1]=q; } } grades=p[m-1].grades; for(int i=m;grades==p[i].grades;i++) m++; printf("%d %d\n",grades,m); for(int i=0;i<m;i++) printf("%d %d\n",p[i].id,p[i].grades); return 0; }
时间: 2024-03-17 19:42:19 浏览: 49
下面是对代码的一些优化建议:
1. 头文件可以更改为`#include <stdlib.h>`来使用`malloc`函数,这是标准库头文件。
2. 可以使用`typedef`来简化结构体的声明,如下所示:
```
typedef struct {
int id, grades;
} Information;
```
3. 在动态分配内存时,应该检查是否分配成功,如果分配失败,则应该处理错误。
4. 冒泡排序是一个比较慢的排序算法,可以考虑使用更快的排序算法,如快速排序。
5. 在找到排名时,可以使用一个变量来保存排名,而不是修改`m`的值。
下面是优化后的代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id, grades;
} Information;
int cmp(const void *a, const void *b) {
Information *p = (Information *)a;
Information *q = (Information *)b;
if (p->grades != q->grades) {
return q->grades - p->grades;
} else {
return p->id - q->id;
}
}
int main() {
int n, m, grades;
scanf("%d %d", &n, &m);
m = (int)(m * 1.5);
Information *p = (Information *)malloc(n * sizeof(Information));
if (p == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
for (int i = 0; i < n; i++) {
scanf("%d %d", &p[i].id, &p[i].grades);
}
qsort(p, n, sizeof(Information), cmp);
grades = p[m - 1].grades;
int rank = m;
for (int i = m; i < n && p[i].grades == grades; i++) {
rank++;
}
printf("%d %d\n", grades, rank);
for (int i = 0; i < rank; i++) {
printf("%d %d\n", p[i].id, p[i].grades);
}
free(p);
return 0;
}
```
优化后的代码使用了`qsort`函数进行排序,时间复杂度为$O(nlogn)$,比冒泡排序的$O(n^2)$要快得多。在找到排名时,使用了一个变量来保存排名,而不是修改`m`的值。同时,在动态分配内存时检查了分配是否成功。
阅读全文