#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) {//首先转换为char类型,在按照每个的字节大小作比较
                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;
}

把冒泡排序升级为可以排列任何数组的排序方式

用冒泡排序模拟qsort的实现_结构体