MST

星途 面试题库

面试题:C语言插入排序处理复杂数据结构

假设有一个结构体数组,结构体包含学生的姓名(字符串)和成绩(整数),要求使用插入排序按成绩从高到低对结构体数组进行排序,用C语言实现该功能,并说明如何处理字符串比较的情况。
42.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <string.h>

// 定义学生结构体
typedef struct {
    char name[50];
    int score;
} Student;

// 插入排序函数,按成绩从高到低排序
void insertionSort(Student arr[], int n) {
    int i, j;
    Student key;
    for (i = 1; i < n; i++) {
        key = arr[i];
        j = i - 1;

        // 将成绩比key小的元素后移
        while (j >= 0 && arr[j].score < key.score) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}

// 打印学生信息函数
void printStudents(Student arr[], int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf("Name: %s, Score: %d\n", arr[i].name, arr[i].score);
    }
}

int main() {
    Student students[] = {
        {"Alice", 85},
        {"Bob", 90},
        {"Charlie", 80},
        {"David", 95}
    };
    int n = sizeof(students) / sizeof(students[0]);

    printf("Before sorting:\n");
    printStudents(students, n);

    insertionSort(students, n);

    printf("\nAfter sorting:\n");
    printStudents(students, n);

    return 0;
}

字符串比较情况处理说明

在本题中,排序主要依据成绩进行,并未涉及字符串比较。但如果要对结构体数组按字符串(如姓名)进行排序,在C语言中可使用strcmp函数。strcmp函数用于比较两个字符串,其原型为int strcmp(const char *s1, const char *s2),如果s1小于s2,返回一个负整数;如果s1等于s2,返回0;如果s1大于s2,返回一个正整数。例如在插入排序中,将比较成绩的部分替换为比较字符串,修改后的代码片段如下:

while (j >= 0 && strcmp(arr[j].name, key.name) < 0) {
    arr[j + 1] = arr[j];
    j = j - 1;
}

这样就可以实现按字符串从大到小排序(因为这里是从高到低排序逻辑)。如果要按从小到大排序,只需将<改为>即可。