一、qsort具体使用
1.库函数
<stdlib.h> and <search.h>
2.参数
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
1.base是指向一个数组的指针
2.num 是该数组的元素个数
3.width是每一个元素单独在空间所占字节大小
4.最后一个为函数指针类型,该函数指针 指向返回值为int类型,2个参数都为void类型的指针的函数。
3 .compare的实现
想简单使用快速排序qsort ,compare函数必须由使用者本身来具体实现,因为qsort的创作者并不了解你所排序的数据是什么类型的。
以数据类型为int为例
int compare(void* p1,void*p2)
{
return *((int*)p1) - *((int*)p2);//
}
以字符串为例
int compare(void* p1,void*p2)
{
return strcmp((char*)p1,(char*)p2);
}
具体使用如下:
#include <stdio.h>
#include<stdlib.h>
int cmp(const void* p1,const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int main()
{
int arr[10] = { 1,5,2,3,4,9,6,7,8,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp);
}
二、qsort具体内部实现
直接上代码:
#include <stdio.h>
#include<stdlib.h>
int cmp(const void* p1,const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
void swap(char* p1, char* p2,int width)
{
int i = 0;
while (i < width)
{
char tmp = *p1;
*p1 = *p2;
*p2 = tmp;
i++;
p1++;
p2++;
}
}
void Myqsort(void* base, int sz, int width, int (*cmp)(const void*, const void*))
{
int i = 0;
int j = 0;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz - 1 - 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);
}
}
}
}
int main()
{
int arr[10] = { 1,5,2,3,4,9,6,7,8,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
Myqsort(arr, sz, sizeof(arr[0]), cmp);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
总结
qsort可用来排序任何类型的数据,能熟练使用qsort对我们刷题很有帮助,简单又方便!

本文详细介绍了标准库函数qsort的具体使用方法,包括其参数说明、比较函数的实现方式,并提供了针对不同类型数据的示例代码。此外,还展示了qsort的一种内部实现思路,有助于读者深入理解并灵活运用这一强大的排序工具。
2676

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



