#include <stdio.h>
#include <string.h>
struct Student {
char name[50];
int dataStructureGrade;
};
// 折半插入排序(升序)
void binaryInsertionSort(struct Student students[], int n, int ascending) {
int i, j;
struct Student temp; //temp存待插入的记录
for (i = 1; i < n; ++i) {
temp = students[i];
int left = 0, right = i - 1;
int mid;
while (left <= right) {
mid = left + (right - left) / 2;
if ((ascending && students[mid].dataStructureGrade > temp.dataStructureGrade) ||
(!ascending && students[mid].dataStructureGrade < temp.dataStructureGrade)) {
right = mid - 1;
} else {
left = mid + 1;
}
}
for (j = i - 1; j >= left; --j) { //将i-1至j+1处的记录依次后移
students[j + 1] = students[j];
}
students[left] = temp;//将待插记录temp插入确定的位置(即课本上的high+1=low(left))
}
}
// 快速排序(降序)
void quickSort(struct Student students[], int left, int right, int ascending) {
if (left >= right) return;
int i = left, j = right;
int pivot = students[(left + right) / 2].dataStructureGrade;//取中间位置记录的成绩值作为枢轴(中心点)
while (i <= j) {
if ((ascending && students[i].dataStructureGrade < pivot) ||
(!ascending && students[i].dataStructureGrade > pivot)) {
i++;
} else if ((ascending && students[j].dataStructureGrade > pivot) ||
(!ascending && students[j].dataStructureGrade < pivot)) {
j--;
} else {
struct Student temp = students[i];
students[i] = students[j];
students[j] = temp;
i++;
j--;
}
}
quickSort(students, left, j, ascending);
quickSort(students, i, right, ascending);
}
// 简单选择排序(升序)
void selectionSort(struct Student students[], int n, int ascending) {
int i, j, minIndex;
struct Student temp;
for (i = 0; i < n - 1; ++i) {
minIndex = i;
for (j = i + 1; j < n; ++j) {
if ((ascending && students[j].dataStructureGrade < students[minIndex].dataStructureGrade) ||
(!ascending && students[j].dataStructureGrade > students[minIndex].dataStructureGrade)) {
minIndex = j;
}
}
if (minIndex != i) {
temp = students[i];
students[i] = students[minIndex];
students[minIndex] = temp;
}
}
}
int main() {
struct Student students[] = {
{"张三", 85},
{"李四", 76},
{"王五", 92},
{"小明", 64},
{"小刚", 89}
};
int numStudents = sizeof(students) / sizeof(students[0]);//记录个数 = students[]的总容量/一个记录的容量
printf("原始数据:\n");
for (int i = 0; i < numStudents; ++i) {
printf("%s %d\n", students[i].name, students[i].dataStructureGrade);
}
// 折半插入排序(从高到低)
binaryInsertionSort(students, numStudents, 1);
printf("\n折半插入排序(从低到高)结果:\n");
for (int i = 0; i < numStudents; ++i) {
printf("%s %d\n", students[i].name, students[i].dataStructureGrade);
}
// 快速排序(从低到高)
quickSort(students, 0, numStudents - 1, 0);
printf("\n快速排序(从高到低)结果:\n");
for (int i = 0; i < numStudents; ++i) {
printf("%s %d\n", students[i].name, students[i].dataStructureGrade);
}
// 简单选择排序(从低到高)
selectionSort(students, numStudents, 1);
printf("\n简单选择排序(从低到高)结果:\n");
for (int i = 0; i < numStudents; ++i) {
printf("%s %d\n", students[i].name, students[i].dataStructureGrade);
}
return 0;
}