qsort函数使用:
qsort函数是c语言提供的库函数,功能是可以对任意数据类型的数组进行排序。
参数:
qsort
(void * vbase, //待排序的数组首元素地址i
size_t nel, //数组元素个数
size_t width, //数组元素大小,单位是字节
int (*compar)(const void *, const void *))//自定义的比较函数
使用举例:
struct stu
{
char name[20];
int age = 0;
};
int cmp(const void* e1,const void* e2)
{
return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
int main()
{
struct stu s[3]{ {"zhangsan",88},{"lisi",50},{"wangwu",22} };
qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp);
return 0;
}
冒泡排序模拟实现qsort函数
先给出冒泡排序代码:
void bubble_sort(int arr[],int sz)
{
//确定冒泡的趟数--趟数=元素数减去1,所以我们需要先确定元素个数。
int i = 0;
for (i = 0; i < sz - 1; i++)//假设sz=10
{
//每一趟冒号排序
int j = 0;
int flag = 1;
for (j = 0; j <sz-1-i ; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag == 1)
{
break;//----break只能用于for循环中,不能用于if语句,而在这里break用于if语句的外层循环。
}
}
}
接下来就是对代码进行改进:
先粘代码,后面解释怎么实现。
void swap(char* buf1,char* buf2,int width)
{
for (int i = 0; i < width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void buble_sort(void* base,size_t num,size_t width,int (*cmp)(void* ,void*))
{
int i = 0;
int j = 0;
for (int i = 0; i < num - 1; i++)
{
for (j = 0; j < num - 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 cmp(void* e1, void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[] = { 9, 8, 7, 5, 4, 3, 2, 1, 0 };
buble_sort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp);
return 0;
}
buble-sort函数第一个参数base:是数组首元素地址
在判断条件中,我们 需要对cmp函数进行传参
由于需要比较任何类型的数据,根据width确定base偏移量,这里比较的是int类型,一个元素是4个字节
(char*)base+j*width:
当j=0时,j+1=1,传给cmp的指针分别指向了第一个元素和第二个元素:
来到cmp函数,cmp形参是void*指针,需要先强制转换成你要比较的元素类型,这里的cmp是用户自己定义的函数,用户可以根据自己的需求来设定需要强制转换成什么类型的数据。
当符合判断条件时,进入swap函数:
swap()函数实现的是根据数据类型,逐个字节的交换内容。
这样就实现了两个元素的交换。