前言
本篇讲qsort函数的使用和如何模拟实现qsort函数
一、函数头文件
#include<stdlib.h>
二、函数声明
void qsort(void* base, //指向了需要排序的数组的第一个元素 size_t num, //排序的元素个数 size_t size,//一个元素的大小,单位是字节 int (*cmp)(const void*, const void*)//函数指针类型 - 这个函数指针指向的函数,能够比较base指向数组中的两个元素 );
三、 参数
- base -- 指向要排序的数组的第一个元素的指针。
- num -- 由 base 指向的数组中元素的个数。
- size -- 数组中每个元素的大小,以字节为单位。
- cmp -- 函数指针类型 - 这个函数指针指向的函数,能够比较base指向数组中的两个元素
四、返回值
该函数不返回任何值。
五、cmp不同类型排序
1、int类型
升序排列 int cmp(const void *a,const void *b) { return *(int*)a-*(int*)b; } //降序排列 //return *(int*)b-*(int*)a;
2.double类型
升序排列 int cmp(const void *a,const void *b) { return *(double*)a-*(double*)b; } //降序排列 //return *(double*)b-*(double*)a;
3.char类型
升序排列 int cmp(const void *a,const void *b) { return *(char*)a-*(char*)b; } //降序排列 //return *(char*)b-*(char*)a;
4、结构体类型
struct Stu { char name[20]; int age; }; int cmp_struct_age(const void* p1, const void* p2) { return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age; }
六、使用展示
#include<stdio.h> #include<stdlib.h> //int类型 int int_cmp(const void* p1, const void* p2) { return(*(int*)p1 - *(int*)p2); } int test1() { int arr[] = { 1,3,5,7,9,2,4,6,8,0 }; qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp); for (int i = 0; i < 10; i++) { printf("%d ", arr[i]); } } //结构体类型 struct Stu { char name[20]; int age; }; int cmp_struct_age(const void* p1, const void* p2) { return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age; } void test2() { struct Stu arr[] = { {"zhangsan",20},{"lisi",50},{"wangwu",15}}; qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_struct_age); } int main() { test1(); test2(); return 0; }
七、模拟实现qsort函数
#include<stdio.h> int int_cmp(const void* p1, const void* p2) { return (*(int*)p1 - *(int*)p2); } void swap(void* p1, void* p2, int size) { int i = 0; for (i = 0; i < size; i++) { char tmp = *((char*)p1 + i); *((char*)p1 + i) = *((char*)p2 + i); *((char*)p2 + i) = tmp; } } void bubble(void* base, int count, int size, int(*cmp)(void*, void*)) { int i = 0; for (i = 0; i < count - 1; i++) { int j = 0; for (j = 0; j < count - 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); } } } } int main() { int arr[] = { 25,35,68,79,21,13,98,7,16,62 }; bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp); for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); } return 0; }
行文至此,请放心食用,如有疑惑,欢迎评论区留言!