#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 5
typedef struct stu
{
char name[20];
float score;
} stu;
int main()
{
stu *pstu = (stu *)malloc(sizeof(stu) * N);
memset(pstu, 0, sizeof(stu) * N);
int i, j;
for (i = 0; i < N; i++)
{
printf("请输入名字和成绩:\n");
scanf("%s %f", pstu[i].name, &pstu[i].score);
}
//方法1:冒泡排序法,交换值
// for (i = 0; i < N - 1; i++)
// {
// for (j = 0; j < N - i - 1; j++)
// {
// if (pstu[j].score > pstu[j + 1].score) //(pstu + j)->score > (pstu + j + 1)->score
// {
// //结构体整体赋值交换
// stu temp;
// temp = pstu[j]; // temp = *(pstu + j);
// pstu[j] = pstu[j + 1]; //*(pstu + j) = *(pstu + j + 1);
// pstu[j + 1] = temp; //*(pstu + j + 1) = temp;
// }
// }
// }
// for (i = 0; i < N; i++)
// {
// printf("姓名:%s;成绩:%f。\n", pstu[i].name, pstu[i].score);
// }
//方法2:建立副本,利用副本交换值并排序下标,用下标值输出原数据
int flag[N] = {0};
stu *ptemp = (stu *)malloc(sizeof(stu) * N);
for (i = 0; i < N; i++)
{
*(ptemp + i) = *(pstu + i);
flag[i] = i;
}
for (i = 0; i < N - 1; i++)
{
for (j = 0; j < N - i - 1; j++)
{
if (ptemp[j].score > ptemp[j + 1].score)
{
int t;
stu temp;
temp = ptemp[j];
ptemp[j] = ptemp[j + 1];
ptemp[j + 1] = temp;
t = flag[j];
flag[j] = flag[j + 1];
flag[j + 1] = t;
}
}
}
for (i = 0; i < N; i++)
{
printf("姓名:%s;成绩:%f。\n", pstu[flag[i]].name, pstu[flag[i]].score);
}
free(pstu);
free(ptemp);
return 0;
}
排序并记录下标
最新推荐文章于 2024-08-07 12:24:41 发布