用c语言帮我写以下题目先依次输入元素为整型或自定义结构体类型(如订单信息或学生信息或员工信息,但务必有一个数据项为整型作为关键字字段)的数个数据元素建立向量结构(数组),然后①对此向量结构的元素施用直接插入排序,输出每一趟排序的结果以及最终排好序的结果;②再使用折半查找排序对此向量结构进行排序输出每一趟排序结果和最后排好序的结果。
时间: 2024-03-21 14:42:35 浏览: 70
c语言实现排序系统(数据结构的课程设计)
3星 · 编辑精心推荐
好的,以下是 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 自定义结构体类型
typedef struct {
int id;
char name[20];
int score;
} Student;
// 直接插入排序
void insertSort(void *vector, int n, size_t size, int (*cmp)(const void *, const void *)) {
int i, j;
void *temp = malloc(size);
for (i = 1; i < n; i++) {
j = i - 1;
memcpy(temp, vector + i * size, size);
while (j >= 0 && cmp(vector + j * size, temp) > 0) {
memcpy(vector + (j + 1) * size, vector + j * size, size);
j--;
}
memcpy(vector + (j + 1) * size, temp, size);
// 输出每一趟排序的结果
printf("第 %d 趟排序结果:", i);
for (int k = 0; k < n; k++) {
printf("%d ", ((Student *) (vector + k * size))->id);
}
printf("\n");
}
free(temp);
}
// 折半查找排序(二分插入排序)
void binaryInsertSort(void *vector, int n, size_t size, int (*cmp)(const void *, const void *)) {
int i, j, low, high, mid;
void *temp = malloc(size);
for (i = 1; i < n; i++) {
memcpy(temp, vector + i * size, size);
low = 0;
high = i - 1;
while (low <= high) {
mid = (low + high) / 2;
if (cmp(vector + mid * size, temp) > 0) {
high = mid - 1;
} else {
low = mid + 1;
}
}
for (j = i - 1; j >= low; j--) {
memcpy(vector + (j + 1) * size, vector + j * size, size);
}
memcpy(vector + low * size, temp, size);
// 输出每一趟排序的结果
printf("第 %d 趟排序结果:", i);
for (int k = 0; k < n; k++) {
printf("%d ", ((Student *) (vector + k * size))->id);
}
printf("\n");
}
free(temp);
}
// 比较函数,按 id 升序排列
int cmp(const void *a, const void *b) {
return ((Student *) a)->id - ((Student *) b)->id;
}
int main() {
int n, i;
printf("请输入元素个数:");
scanf("%d", &n);
Student *students = (Student *) malloc(n * sizeof(Student));
// 输入元素
printf("请输入 %d 个学生信息(id, name, score):\n", n);
for (i = 0; i < n; i++) {
scanf("%d %s %d", &students[i].id, students[i].name, &students[i].score);
}
// 直接插入排序
printf("\n直接插入排序结果:\n");
insertSort(students, n, sizeof(Student), cmp);
// 输出最终排好序的结果
printf("\n直接插入排序最终结果:");
for (i = 0; i < n; i++) {
printf("%d ", students[i].id);
}
printf("\n");
// 折半查找排序
printf("\n折半查找排序结果:\n");
binaryInsertSort(students, n, sizeof(Student), cmp);
// 输出最终排好序的结果
printf("\n折半查找排序最终结果:");
for (i = 0; i < n; i++) {
printf("%d ", students[i].id);
}
printf("\n");
free(students);
return 0;
}
```
其中,`Student` 结构体表示学生信息,包含 `id`、`name` 和 `score` 三个字段;`insertSort` 函数实现直接插入排序算法;`binaryInsertSort` 函数实现折半查找排序算法;`cmp` 函数为比较函数,按 `id` 升序排列。在 `main` 函数中,先输入元素,然后分别对其进行直接插入排序和折半查找排序,最后输出排好序的结果。
阅读全文