1.qsort使用
qsort是C语言提供的一个库函数,他可以对任何类型的排序进行比较,很通用。
第一个参数为待排元素首地址,第二个参数为元素个数,第三个参数为元素宽度,第四个参数为比较函数。
下图为比较整型的代码示例:
而应对不同的数据类型,我们只需修改相应的cmp即可
1.1 浮点型(double)
int cmp(const void* e1, const void* e2)//void *可以用来接收任何类型的指针 { double* p1 = (double*)e1; double* p2 = (double*)e2; if ((*p1 - *p2) < 0) { return -1; } else if ((*p1 - *p2) > 0) { return 1; } else { return 0; } }
因为*p1和*p2,都是double型数,如果两个数相差不大时,由于返回类型为int,数据不等但是会导致返回类型为0的问题。因此用if语句较合适。
1.2字符串类型
int cmp(const void* e1, const void* e2)//void *可以用来接收任何类型的指针 { char* p1 = (char*)e1; char* p2 = (char*)e2; return strcmp(p1, p2); }
字符串何以借助strcmp函数来比较,而strcmp的逻辑正好与cmp的逻辑相同,因此可以直接使用。
1.3结构体类型
struct Peo { char name[20]; int score; }; int cmp(const void* e1, const void* e2)//void *可以用来接收任何类型的指针 { struct Peo * p1 = (struct Peo*)e1; struct Peo* p2 = (struct Peo*)e2; return p1->score - p2->score; }
2.qsort模拟实现
由于博主能力有限,现使用bubble_sort的逻辑来实现qsort。
void Swap(char* p1, char* p2,int width) { int i = 0; //一个字节一个字节的交换 for (i = 0; i < width; i++) { //tem不要用cahr *tem; char tem = *(p1+i); *(p1+i) = *(p2+i); *(p2 + i) = tem; } } //base 元素首地址 ,num 元素个数,width元素宽度, cmp辅助比较函数 void bubble_sort(void* base, int num, int width, int (*cmp)(const void* e1, const void* e2)) { int i = 0; int j = 0; for (i = 0; i < num - 1; i++) { for (j = 0; j < num - 1 - i; j++) { //传进去第i个元素和第j个元素的第一个字节地址 if (cmp((char*)base + j * width, (char*)base + (j+1) * width) > 0) { //交换 Swap((char*)base + j * width, (char*)base + (j + 1) * width,width); } } } }
以上是qsort的简单模拟,如有问题,恳请大佬指点💖