大家好,大家都知道排序在程序算法设计中起到了非常关键的作用,那么今天我想给大家讲讲qsort这个函数以及它的模拟实现。
? ? ? ? 下面让我们看看qsort这个函数(这个函数内部是快速排序)
大家可以看到这个函数有四个参数,那么这四个参数是代表着什么意思呢。
void* base;//这个指针指向数组的首元素
size_t num;//代表数组有多少个元素。
size_t size;//代表一个元素多大。
int(*compar)(const void*,const void*);//这是一个返还类型为int,参数是const void*的函数指针,
这个函数能实现任意数据类型的排序,无论是int char double 还是结构体他都可以,那么它是怎么实现的呢。其实只要把它的几个参数搞清楚就行了
void bubble_qsort(void* base,size_t sz,size_t wight,int(*compar)(const void*, const void*))
{
size_t i = 0;
for (i = 0; i < sz - 1; i++)
{
size_t j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if ((compar(((char*)base + width * j), (char*)base + width * (j + 1))) > 0)//比较两个数
{
//交换
swap(((char*)base + width * j), ((char*)base + width * (j + 1)),width);
}
}
}
}
大家可以看看这串代码,
void swap(char* p1, char* p2,int wight)//交换函数
{
//完成交换
for (int i = 0; i < wight; i++)
{
char tmp = 0;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2++;
}
}
这里是交换的代码也是按照冒泡排序来写的,这个是一个字节一个字节的交换的所以我们要把width传过来。
typedef struct stu
{
char name[20];
int age;
int sorce;
}St;
//定义一个关于学生的结构体
int compar_name(const void* p1, const void* p2)
{
return strcmp(((St*)p1)->name, ((St*)p2)->name);
}//结构体名字的比较大小
int compar_age(const void* p1, const void* p2)
{
return (((St*)p1)->age- ((St*)p2)->age);
}//结构体年龄的比较大小
int compar_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}//整数的比较大小
按照年龄