冒泡排序
#include <stdio.h>
// 交换数组中指定两个位置的元素
void swap(int * pArr, int pos1, int pos2) {
int temp = pArr[pos1];
pArr[pos1] = pArr[pos2];
pArr[pos2] = temp;
}
// 冒泡排序
void sort(int * pArr, int len) {
int i, j;
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - 1 - i; j++) {
if (pArr[j] > pArr[j + 1]) {
swap(pArr, j, j + 1);
}
}
}
}
// 打印
void printArr(int * pArr, int len) {
int i = 0;
for (; i < len; i++) {
printf("%d, ", pArr[i]);
}
printf("\n");
}
int main(void) {
int a[6] = { 8, 3, 6, 2, 5, 0 };
printArr(a, 6);
sort(a, 6);
printArr(a, 6);
return 0;
}
动态结构体数组举例
#include <stdio.h>
#include <malloc.h>
#include <string.h>
/*
1, 需求
学生信息管理系统, 存放所有学生信息, 按分数排序输出
2, 设计
1) 用数组 存放 所有学生
2) 用结构体 描述 每个学生
3) 使用 冒泡排序 对学生进行排序
*/
// 定义结构体
struct Student {
char name[100]; // 姓名
float score; // 分数
};
// 添加学生
void addStu(struct Student * pStuArr, char name[100], float score, int index) {
strcpy( pStuArr[index].name, name);
pStuArr[index].score = score;
}
// 排序, 按分数降序
void sort(struct Student * pStuArr, int len) {
int i, j;
struct Student temp;
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - 1 - i; j++) {
if (pStuArr[j].score < pStuArr[j+1].score) {
temp = pStuArr[j]; // 换学生在数组中的位置, 而不是学生的成绩
pStuArr[j] = pStuArr[j+1];
pStuArr[j+1] = temp;
}
}
}
}
// 打印所有学生
void printStus(struct Student * pStuArr, int len) {
int i;
for (i = 0; i < len; i++) {
printf("%s, %f \n", pStuArr[i].name, pStuArr[i].score);
}
}
int main(void) {
int len = 5;
struct Student * stuArr;
// 动态构建数组
stuArr = (struct Student *) malloc( sizeof(struct Student) * len );
int index = 0;
// 录入学生信息
// scanf("%f", &stuArr[i].score) 给 学生的 score 赋值
// scanf("%s", stuArr[i].name) 给学生 name 赋值, name本身就是 char数组的首地址,无需用"&"
addStu(stuArr, "小红-66", 66.6f, index++);
addStu(stuArr, "大红-55", 55.5f, index++);
addStu(stuArr, "大黄-88", 88.8f, index++);
addStu(stuArr, "小黄-77", 77.7f, index++);
addStu(stuArr, "晓晓-44", 44.4f, index++);
// 给学生排序, 按分数 降序
sort(stuArr, len);
// 打印
printStus(stuArr, len);
return 0;
}