库函数qsort 以及模拟实现
1.库函数qsort介绍
代码样例:
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
四个参数 1需要排序的首地址,2需要排序的个数,3每个数据的大小,4排序函数
使用参考
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
return (*(int*)e1 - *(int*)e2);
}
int cmp_double(const void* e1, const void* e2)
{
return (*(double*)e1 > *(double*)e2) ? 1 : -1;//不能直接相减,double数据转为int数据会丢失
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
double arr1[10] = { 1.11,2.22,3.3,4.4,5.5,6.6,7.9,8.2,9.1,10.12 };
sz = sizeof(arr1) / sizeof(arr1[0]);
qsort(arr1,sz,sizeof(double),cmp_double);
for (int i = 0; i < sz; i++)
{
printf("%.2lf ", arr1[i]);
}
return 0;
}
自己所写的函数只要返回一个整形,qsort就可以进行排序.
2.库函数qsort模拟实现
根据qsort的参数,我们可以模仿实现一个my_qsort()来模仿实现.
#include<stdio.h>
int cmp_int(const void* e1, const void* e2)
{
return (*(int*)e1 - *(int*)e2);
}
void Swap(char *e1,char *e2,int width)
{
int i = 0;
char tmp;
for (i = 0; i < width; i++)
{
tmp = *e1;
*e1 = *e2;
*e2 = tmp;
e1++;
e2++;
}
}
void my_qsort(void* p, int sz, int width, int(*cmp)(const void* e1, const void* e2))
{
for (int i = 0; i < sz - 1; i++)
{
int flag = 1;
for (int j = 0; j < sz - i - 1; j++)
{
if (cmp((char*)p + j * width, (char*)p + (j + 1) * width)>0)
{
Swap((char*)p + j * width, (char*)p + (j + 1) * width,width);
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
int main()
{
int arr[10] = { 1,3,5,2,4,6,8,9,7,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr,sz,sizeof(arr[0]),cmp_int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
代码运行图:

my_qsort()函数的实现,首先必须参数需要void *类型指针,因为my_sqort是用来排序多种数据类型,不止int一种类型.接下来,在swap()函数中参数使用char *类型char *类型一次访问一个字节,方便控制元素大小,便于后续的操作,在交换函数内部,将数据全部交换即可.其次注意事项与qsort函数的注意事项相同
本文详细介绍了C语言库函数qsort的用法,包括其参数解读、代码示例和两种排序函数的编写。同时,模拟实现了my_qsort函数,演示了如何根据qsort参数进行不同类型数据的排序。
302

被折叠的 条评论
为什么被折叠?



