我的快速排序只排序标记而不是标记和学生 ID
My quicksort is sorting just marks instead of marks and student ids
当我在主函数中打印 stu[] 结构数组时,它只对标记进行排序,但 ID 保持不变。因此,例如 stuid abc 有标记 23,def 有标记 12,它交换标记,所以 abc 有 12,def 有 23。我如何做到这一点,以便标记与 id 交换。
struct student
{
char id[20];
int mark;
};
typedef struct student Student;
Student stu[5];
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
int partition (Student stu[], int low, int high)
{
int pivot = stu[high].mark;
int i = (low - 1);
for (int j = low; j <= high- 1; j++)
{
if (stu[j].mark < pivot)
{
i++;
swap(&stu[i].mark, &stu[j].mark);
}
}
swap(&stu[i + 1].mark, &stu[high].mark);
return (i + 1);
}
void quickSort(Student stu[], int low, int high)
{
if (low < high)
{
int pi = partition(student, low, high);
quickSort(student, low, pi - 1);
quickSort(student, pi + 1, high);
}
}
原代码只是交换关键字段,但需要交换整个记录。
更改 swap
函数以交换 Student
s 而不是 int
s:
void swap(Student* a, Student* b)
{
Student t = *a;
*a = *b;
*b = t;
}
更改对 swap
的调用以传递指向 Student
的指针而不是指向 Student.mark
值的指针:
swap(&stu[a], &stu[b]);
当我在主函数中打印 stu[] 结构数组时,它只对标记进行排序,但 ID 保持不变。因此,例如 stuid abc 有标记 23,def 有标记 12,它交换标记,所以 abc 有 12,def 有 23。我如何做到这一点,以便标记与 id 交换。
struct student
{
char id[20];
int mark;
};
typedef struct student Student;
Student stu[5];
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
int partition (Student stu[], int low, int high)
{
int pivot = stu[high].mark;
int i = (low - 1);
for (int j = low; j <= high- 1; j++)
{
if (stu[j].mark < pivot)
{
i++;
swap(&stu[i].mark, &stu[j].mark);
}
}
swap(&stu[i + 1].mark, &stu[high].mark);
return (i + 1);
}
void quickSort(Student stu[], int low, int high)
{
if (low < high)
{
int pi = partition(student, low, high);
quickSort(student, low, pi - 1);
quickSort(student, pi + 1, high);
}
}
原代码只是交换关键字段,但需要交换整个记录。
更改 swap
函数以交换 Student
s 而不是 int
s:
void swap(Student* a, Student* b)
{
Student t = *a;
*a = *b;
*b = t;
}
更改对 swap
的调用以传递指向 Student
的指针而不是指向 Student.mark
值的指针:
swap(&stu[a], &stu[b]);