冒泡排序与qsort函数的结合
首先给大家回顾一下冒泡排序
void bubble_sort(int arr[], int sz)
{
//确定趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
//每趟进行两两互相比较
int j = 0;
for (j = 0; j < sz - i - 1; j++)
{
if (arr[j] < arr[j + 1])
{
int tmp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = tmp;
}
}
}
}
冒泡排序就是在一个有序数组内部两两相邻元素进行比较。
而它与qsort函数将擦出什么样的火花呢?
qsort函数结构
首先我们先回忆以下qsort函数的结构
qsort(void*base, size_t sz, size_t width, int (*compar)(const void*,const void*)
void*base: 需要比较的数组元素的地址.
size_t sz: 需要比较的数组元素个数.
size_t width:数组中每个元素的大小(单位是字节)
int (*compar)(const void*,const void*) :用来调用比较函数compar是函数名 后面的两个参数分别是数组中两个被比较元素的指针
冒泡函数的结构
bubble_sort(int arr[],int sz)
int arr[] :需要比较的目标数组
int sz:数组中的元素个数
结合思路
冒泡排序实现思路
冒泡排序的思路就是根据数组元素的数量确定需要排序的趟数,以及每趟两两排序的次数,而确定趟数思路就是用元素个数减一,而确定排序次数则是每次比较都会比上一次少一次,所以只需要在趟数的for循环下面再次嵌套一个for循环减去趟数在减去一便是次数,根据这个思路我们可以确定需要传的参数有数组地址,数组内元素个数,以及数组每个元素的大小,用来找下一个元素,
qsort函数特点
首先我们知道qsort函数的底层逻辑是快速排序,既可以排序字符串也可以排序整形元素,结构体,其中需要改变的只有需要调用的用来比较的函数。
代码展示
将qsort函数参数换到冒泡排序
void bubble_sort(void* base, size_t sz, size_t width, int(*cmp)(const void* p1, const void* p2))
{
//确定趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
//每趟进行两两互相比较
int j = 0;
for (j = 0; j < sz - i - 1; j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
交换代码块
void swap(char* c1, char* c2, size_t width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *c1;
*c1 = *c2;
*c2 = tmp;
c1++;
c2++;
}
}
冒泡排序中if条件判断代码块
int cmp_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
主函数以及test函数
void test1()
{
int arr[] = { 2,1,6,4,3,5,8,9,0,7 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
print_arr(arr, sz);
}
int main()
{
test1();
return 0;
}
注意
判断条件内指针类型为char*是因为有的时候需要排序元素的大小不一,我们规定了每个元素的宽度单位字节,而char*的大小是一个字节,我们只需要循环宽度的大小便可以比较的每个元素,而在交换的时候也是一个字节一个字节的交换,所以类型转换为char*。
其次我们需要注意的是在每一个函数内部如果需要调用其他函数就必须把需要调用的函数放在该函数代码块的上面,或者也可以增加函数声明,不然不能成功运行
最后如果本篇文章存在错误望指正,感谢各位大佬
标签:sz,arr,函数,int,void,qsort,冒泡排序 From: https://blog.csdn.net/weixin_74837455/article/details/136717951