优化这段代码:#include <stdio.h> typedef struct inf1 { char name; int grade; }inf; void sort(int s[],int r[],int n); void swap(int r[],int i,int j); int main() { int n,i; scanf("%d",&n); inf chart[n]; //inf *chart=(inf *)malloc(n * sizeof(inf)); int rank[n]; int mark[n]; for(i=0;i<n;i++) { scanf("%s,%d",&chart[i].name,&chart[i].grade); mark[i]=i; } for(i=0;i<n;i++) rank[i]=chart[i].grade; sort(rank,mark,n); for(i=0;i<n;i++) printf("%s,%d",chart[mark[i]].name,chart[mark[i]].grade); return 0; } void sort(int s[],int r[],int n) { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(s[r[i]]<s[r[j]]) swap(r,i,j); } } } void swap(int r[],int i,int j) { int temp; temp=r[i]; r[i]=r[j]; r[j]=temp; }
时间: 2024-03-17 11:44:15 浏览: 109
这段代码存在一些需要优化的问题:
1. 结构体 `inf1` 中的 `name` 只能存储单个字符,应该改为 `char name[10]` 等可以存储字符串的类型。
2. 在 `scanf` 中使用 `%s` 格式化字符串时,需要指定字符串的长度,否则可能会发生缓冲区溢出的问题。
3. 在排序中使用了冒泡排序,时间复杂度为 $O(n^2)$,在数据较大时会导致性能问题。
以下是对代码的优化建议:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[10];
int grade;
} Student;
void sort(Student *students, int n);
void merge(Student *students, int left, int mid, int right);
int main() {
int n, i;
scanf("%d", &n);
Student *students = (Student *)malloc(n * sizeof(Student));
for (i = 0; i < n; i++) {
scanf("%s%d", students[i].name, &(students[i].grade));
}
sort(students, n);
for (i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].grade);
}
free(students);
return 0;
}
void sort(Student *students, int n) {
int step, left, mid, right;
for (step = 1; step < n; step *= 2) {
for (left = 0; left < n - step; left = right) {
right = left + step * 2;
if (right > n) {
right = n;
}
mid = left + step;
merge(students, left, mid, right);
}
}
}
void merge(Student *students, int left, int mid, int right) {
int i = left, j = mid, k = 0;
Student *tmp = (Student *)malloc((right - left) * sizeof(Student));
while (i < mid && j < right) {
if (students[i].grade < students[j].grade) {
tmp[k++] = students[i++];
} else {
tmp[k++] = students[j++];
}
}
while (i < mid) {
tmp[k++] = students[i++];
}
while (j < right) {
tmp[k++] = students[j++];
}
memcpy(students + left, tmp, k * sizeof(Student));
free(tmp);
}
```
优化后的代码使用归并排序,时间复杂度为 $O(n\log n)$,可以更好地处理大量数据。同时,结构体中的 `name` 变为了字符串类型,避免了缓冲区溢出的问题。
阅读全文