模拟实现qsort函数

  • 1.测试bubble_sort,排序整型数组
  • 2测试bubble_sort,排序结构体数组

关于qsort函数,我们可以先去cpluplus网站上面了解一下:

//1.排序整型数组,两个整型可以直接使用大于号比较。//2.排序结构体数组,两个结构体数据可能不能直接使用大于号比较。//不同类型的数据,比较出大小,方法是有差异的。void qsort (void* base//待排序数组的第一个元素的地址, size_t num//待排序数组的元素个数, size_t size//待排序数组中一个元素的大小, int (*compar)(const void* e1,const void* e2));//函数指针compar指向了一个函数,这个函数是用来比较两个元素的//e1和e2中存放的是需要比较的两个元素的地址

1.测试bubble_sort,排序整型数组

#define _CRT_SECURE_NO_WARNINGS 1#include //目标:使用冒泡排序的算法,模拟实现一个排序函数,可以排列任意类型的数据void bubble_sort(int arr[],int sz){int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - i - 1; j++){if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}void print_arr(int arr[], int sz){int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");}void test1(){int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//降序//排序为升序int sz = sizeof(arr) / sizeof(arr[0]);print_arr(arr, sz);bubble_sort(arr, sz);print_arr(arr, sz);}int main(){//整型数据/字符数据/结构体数据...//可以使用qsort函数进行排序//测试bubble_sort,排序整型数组test1();return 0;}

✅运行示例:


我们发现上述代码只适用于整型数据,那么我们是否能写出更一般的更普遍的代码呢?

#define _CRT_SECURE_NO_WARNINGS 1#include //目标:使用冒泡排序的算法,模拟实现一个排序函数,可以排列任意类型的数据void print_arr(int arr[], int sz){int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");}//int (*cmp)(const void* e1, const void* e2)//e1是一个指针,存放了一个要比较的元素的地址//e2也是一个指针,存放了一个要比较的元素的地址//e1指向的元素>e2指向的元素,返回>0的数字//e1指向的元素==e2指向的元素,返回0//e1指向的元素<e2指向的元素,返回<0的数字void swap(char* buf1, char* buf2, size_t size){int i = 0;for (i = 0; i < size; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}}int cmp_int(const void* e1, const void* e2){return *(int*)e1 - *(int*)e2;}void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void* e1, const void* e2)){//冒泡排序的趟数int i = 0;for (i = 0; i < num - 1; i++){//一趟冒泡排序int j = 0;for (j = 0; j < num - 1 - i; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){//交换swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}}void test1(){int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//降序//排序为升序int sz = sizeof(arr) / sizeof(arr[0]);print_arr(arr, sz);bubble_sort(arr, sz,sizeof(arr[0]),cmp_int);print_arr(arr, sz);}int main(){//整型数据/字符数据/结构体数据...//可以使用qsort函数进行排序//测试bubble_sort,排序整型数组test1();return 0;}

✅运行示例:

运行流程如下:

2测试bubble_sort,排序结构体数组

按照年龄排序:

#define _CRT_SECURE_NO_WARNINGS 1#include //目标:使用冒泡排序的算法,模拟实现一个排序函数,可以排列任意类型的数据struct Stu{char name[20];int age;};//int (*cmp)(const void* e1, const void* e2)//e1是一个指针,存放了一个要比较的元素的地址//e2也是一个指针,存放了一个要比较的元素的地址//e1指向的元素>e2指向的元素,返回>0的数字//e1指向的元素==e2指向的元素,返回0//e1指向的元素<e2指向的元素,返回<0的数字void swap(char* buf1, char* buf2, size_t size){int i = 0;for (i = 0; i < size; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}}int cmp_stu_by_age(const void* e1, const void* e2){return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;}void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void* e1, const void* e2)){//冒泡排序的趟数int i = 0;for (i = 0; i < num - 1; i++){//一趟冒泡排序int j = 0;for (j = 0; j < num - 1 - i; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){//交换swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}}void test2(){struct Stu arr[] = { {"Zhangsan",20},{"lisi",19},{"wangwu",18} };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz,sizeof(arr[0]),cmp_stu_by_age); int i = 0;for (i = 0; i < sz; i++){printf("%s %d", arr[i].name, arr[i].age);printf("\n");}printf("\n");}int main(){//整型数据/字符数据/结构体数据...//可以使用qsort函数进行排序//测试bubble_sort,排序整型数组test2();return 0;}

✅运行示例:

按照姓名排序:

#define _CRT_SECURE_NO_WARNINGS 1#include #include //目标:使用冒泡排序的算法,模拟实现一个排序函数,可以排列任意类型的数据struct Stu{char name[20];int age;};//int (*cmp)(const void* e1, const void* e2)//e1是一个指针,存放了一个要比较的元素的地址//e2也是一个指针,存放了一个要比较的元素的地址//e1指向的元素>e2指向的元素,返回>0的数字//e1指向的元素==e2指向的元素,返回0//e1指向的元素<e2指向的元素,返回<0的数字void swap(char* buf1, char* buf2, size_t size){int i = 0;for (i = 0; i < size; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}}int cmp_stu_by_name(const void* e1, const void* e2){//strcmp为字符串比较函数,需要添加头文件#include return strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name);}void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void* e1, const void* e2)){//冒泡排序的趟数int i = 0;for (i = 0; i < num - 1; i++){//一趟冒泡排序int j = 0;for (j = 0; j < num - 1 - i; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){//交换swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}}void test2(){//一个结构体大小32个字节struct Stu arr[] = { {"zhangsan",20},{"lisi",19},{"wangwu",18} };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);int i = 0;for (i = 0; i < sz; i++){printf("%s %d", arr[i].name, arr[i].age);printf("\n");}printf("\n");}int main(){//整型数据/字符数据/结构体数据...//可以使用qsort函数进行排序//测试bubble_sort,排序整型数组test2();return 0;}

✅运行示例:

好啦,关于qsort函数的知识到这里就先结束啦,后期会继续更新学习C语言的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️