自学内容网 自学内容网

C语言 ——— 冒泡排序的思想 实现功能类似 快速排序qsort函数(适用于任意类型数据)

目录

前言

学习qsort函数的参数

实现冒泡排序思想的qsort函数


前言

使用冒泡排序的思想,适用于任意类型数据的排序

实现功能类似qsort函数前须知:

冒泡排序:C语言 ——— 冒泡排序(只适用于整型数组)_冒泡排序只能排序整数吗-CSDN博客

关于函数指针的讲解请见:C语言 ——— 函数指针的定义 & 函数指针的使用-CSDN博客

关于回调函数的讲解请见:C语言 ——— 回调函数的定义及用法-CSDN博客 

想要模拟实现 qsort函数,就要先学习 qsort函数 的参数


学习qsort函数的参数

qsort函数的参数:

void* base:base指向的是待排序的数据的首元素地址

size_t num:待排序数据的元素个数

size_t size:每个元素个数的大小(单位是字节)

int (*compar) (const void* p1, const void* p2):这是一个函数指针,用来比较两个元素的大小,p1 和 p2 是两个元素的地址,当 p1 < p2 时,返回小于0的数字;当 p1 == p2 时,返回等于0的数字;当 p1 > p2 时,返回大于0的数字,自主实现此函数

注意:qsort默认排成升序 


实现冒泡排序思想的qsort函数

void Swap(char* buf1, char* buf2, size_t size)
{
char tmp = 0;

for (size_t i = 0; i < size; i++)
{
tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;

buf1++;
buf2++;
}
}

void bubble_sort(void* base, size_t sum, size_t size, int(*compar)(const void*, const void*))
{
// 趟数
for (size_t i = 0; i < sum; i++)
{
// 插旗
int flag = 1;

// 每趟内部比较的对数
for (size_t j = 0; j < sum - 1 - i; j++)
{
// 升序,第一个元素大于第二个元素时返回大于0的数字
if ( (*compar)((char*)base + j * size, (char*)base + (j + 1) * size) > 0 )
{
// 交换两个元素
Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);

// 拔旗
flag = 0;
}
}

// 判断旗是否是插上的,是插上的就表示当前比较的数组已经有序了
if (flag)
return;
}
}

代码解析: 

解析:(char*)base + j * size, (char*)base + (j + 1) * size

找到当前要比较的数据的第一个元素的首地址和第二个元素的首地址 

解析:void Swap(char* buf1, char* buf2, size_t size)

交换函数,不能确定当前要交换的元素的大小,所以要将size传递进来,且char*类型的指针解引用每次拿出1个字节,所以两个元素每个字节交换,递增交换size次,就能交换两个元素

代码验证:

测试bubble_sort 排序整型数组: 

自主实现compar_int函数:

int compar_int(const void* p1, const void* p2)
{
return *((int*)p1) - *((int*)p2);
}

测试bubble_sort排序浮点型数组:

自主实现compar_double函数:

int compar_double(const void* p1, const void* p2)
{
return *((double*)p1) - *((double*)p2);
}

测试bubble_sort排序结构体数组:

自主实现compar_struct_buy_age函数 和 结构体:

struct person
{
char name[20];
int age;
};

int compar_struct_buy_age(const void* p1, const void* p2)
{
return ((struct person*)p1)->age - ((struct person*)p2)->age;
}

 


原文地址:https://blog.csdn.net/weixin_55341642/article/details/140723996

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!