qsort函数
什么是qsort函数
qsort函数是一个库函数,一个基于快速排序算法实现的一个排序函数。
1. qsort函数声明
void—— 其中函数的返回类型是不返回任何值;
base——首先告诉qsort函数需要排序数据数组的起始位置,位置使用指针保存和传递;
num——然后告诉qsort函数需要排序数据数组的元素个数;
width——再告诉qsort函数需要排序数据数组其中一个数组元素的字节大小;
compare—— 最后告诉qsort函数一个比较函数的函数指针,同时给出比较函数中待比较的两个数据元素的地址。
2. void* 指针
void* 指针是五确切类型的指针,不能直接解引用!!!!!它相当于“垃圾桶”。需要先强制类型转换,再解引用。eg:* (int*) elem1;
3. 比较函数
把一个函数指针给qsort函数,这个指针指向使用者自定义的比较函数。
要求qsort函数的使用者自定义一个比较函数。如果排序的是整型数据可以用<,>等比较,但是如果排序的是结构体数据:按照身高或者体重或者其他的排序,就可能不方便直接使用<,>比较,所以使用者根据实际情况提供一个比较函数实现两个数据的比较。返回类型是int类型。
代码实例
演示qsort()函数用法:
int int_cmp(const void* e1, const void* e2)
{
return (*(int*)e1-*(int*)e2);
}
int main()
{
int arr[] = { 1,5,7,3,6,9,8,4 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), int_cmp);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
使用冒泡方式模拟实现qsort函数
//比较函数,e1>e2返回>0的数,e1<e2返回<0的数,e1=e2返回0
int int_cmp(const void* e1, const void* e2)
{
return (*(int*)e1 - *(int*)e2);
}
//交换函数,由于qsort作者最开始不知道我们要交换的比较数据是什么类型的,所以都是void*,再强制类型转换成char*使用
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;
}
}
//冒泡方式模拟qsort函数
void my_qsort(void* base, int num, int size, int (*cmp)(void*, void*))
{
int i = 0;
int j = 0;
for (i = 0; i < num - 1; i++)
{
for (j = i+1; j < num; j++)
{
if (cmp((char*)base + i * size, (char*)base + j* size) > 0)
{
_swap((char*)base + i * size, (char*)base + j * size, size);
}
}
}
}
int main()
{
int arr[] = { 1,5,7,3,6,9,8,4 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr,sz,sizeof(arr[0]), int_cmp);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}