SY-6..

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值