用冒泡排序模拟qsort的实现

时间:2021-08-01 00:55:01
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//交换
void swap(char* arr1, char* arr2, int width) {
int i = 0;
for (i = 0; i < width; i++) {
char arr = *arr1;
*arr1 = *arr2;
*arr2 = arr;
arr1++;
arr2++;
}
}
//bubble_sort函数的主体
void bubble_sort(void* arr, int sz, int width, int(*cmp)(void*e1, void*e2)) {
int i = 0;
for (i = 0; i < sz - 1; i++) {//趟数
int j = 0;
for (j = 0; j < sz - 1 - i; j++) {//每趟比较次数
//比较方式
if (cmp((char*)arr + j * width, (char*)arr + (j + 1) * width) > 0) {
swap((char*)arr + j * width, (char*)arr + (j + 1) * width,width);//交换
}
}
}
}
//结构体
struct stu {
char name[20];
int age;
};
//整型比较方式
int cmp_int(const void* pa, const void* pb) {
return (*(int*)pa - *(int*)pb);
}
//浮点型比较方式
int cmp_float(const void* pa, const void* pb) {
return (*(float*)pa - *(float*)pb);
}
//结构体比较方式--年龄
int cmp_con(const void* pa, const void* pb) {
return (((struct stu*)pa)->age - ((struct stu*)pb)->age);
}
//结构体比较方式--名称
int cmp_coname(const void* pa, const void* pb) {
return (strcmp(((struct stu*)pa)->name, ((struct stu*)pb)->name));
}
//整型打印
void print1(int arr[], int sz) {
int i = 0;
for (i = 0; i < sz; i++) {
printf("%d ", *(arr + i));
}
printf("\n");
}
//浮点型打印
void print2(float arr[], int sz) {
int i = 0;
for (i = 0; i < sz; i++) {
printf("%f ", arr[i]);
}
printf("\n");
}
//结构体打印
void print3(struct stu* arr, int sz) {
int i = 0;
for (i = 0; i < sz; i++) {
printf("%s ", (arr + i)->name);
}
printf("\n");
}
int main() {
int i = 0;
//整型
int arr1[] = { 9,8,7,6,4,5,1,2,3 };
int sz1 = sizeof(arr1) / sizeof(arr1[0]);
//浮点型
float arr2[] = { 9.0,8.0,7.0,6.0,5.0 };
int sz2 = sizeof(arr2) / sizeof(arr2[0]);
//结构体
struct stu arr3[] = { {"liming",20},{"lishui",25},{"zhangneng",15} };
int sz3 = sizeof(arr3) / sizeof(arr3[0]);
//整型qsort的使用
bubble_sort(arr1, sz1, sizeof(arr1[0]), cmp_int);
print1(arr1, sz1);
//浮点型qsort的使用
bubble_sort(arr2, sz2, sizeof(arr2[0]), cmp_float);
print2(arr2, sz2);
//结构体qsort的使用
bubble_sort(arr3, sz3, sizeof(arr3[0]), cmp_con);//年龄的比较
print3(arr3, sz3);

bubble_sort(arr3, sz3, sizeof(arr3[0]), cmp_coname);//名字的比较
print3(arr3, sz3);


return 0;
}