成都网站建设设计

将想法与焦点和您一起共享

C语言学习qsort()函数及模拟实现-全解析-创新互联

目录

10年积累的做网站、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先做网站后付款的网站建设流程,更有潮安免费网站建设让你可以放心的选择与我们合作。

一、认识qsort()函数

二、使用qsort()函数

 1:  冒泡排序: C语言实现冒泡排序【全解析】_weixin_52872520的博客-博客

 2:qsort()函数:

3:具体使用:

三、模拟实现qsort()函数

四、以排序整形为例讲解qsort()函数


一、认识qsort()函数
void qsort( void *base,    //待排序数组的起始地址
            size_t num,    //元素个数
            size_t width,  //一个元素的大小,单位:字节
            int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
            //两个元素的比较函数
            //通过函数指针调用自己定义的比较函数,这个定义的比较函数被称为回调函数
二、使用qsort()函数        1:  冒泡排序: C语言实现冒泡排序【全解析】-博客        2:qsort()函数:

在冒泡排序中,已经实现了整形数组的排序,可是对于字符数组、浮点型数组、结构体数组等其他类型的排序就不用去自己写算法实现,而是通过qsort() - 快速排序实现。

int ( *compare )(const void *elem1, const void *elem2 )

函数的形参被指定为 void* ,可以理解为 void* 为一个通用指针(垃圾桶),可以接收任何类型的指针,void* 的指针不能解引用和 ++,即不能直接使用。但是可以对 void* 的指针进行强制类型转换后使用。

例如:

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

在比较函数中:

3:具体使用:

  快速排序整形数组:

#include#includeint cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
void main()
{

	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//库函数中一个排序函数:qsort
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	//0 1 2 3 4 5 6 7 8 9
	//打印
	int i = 0;
	for (i = 0; i< sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

  快速排序结构体:

#include#includestruct Stu
{
	char name[20];
	int age;
};

//按照学生的年龄来排序
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//按照学生的名字来排序
int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp() : 字符串比较函数:按照对应位置上的字符串大小进行比较的
//abcdef  小
//abd     大

int  main()
{
	struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };
	int sz = sizeof(s) / sizeof(s[0]);
	//qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
	return 0;
}
三、模拟实现qsort()函数

  改造冒泡排序函数,使得该函数可以排序任意指定的数组。

//使用我们自己写的bubble_sort函数排序整型数组
#include#include//
//实现一个比较整型的函数
// 
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
struct Stu
{
	char name[20];
	int age;
};
//按照学生的年龄来排序
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//按照学生的名字来排序
int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp() : 字符串比较函数:按照对应位置上的字符串大小进行比较的
//abcdef  小
//abd     大
void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i< width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
//改造冒泡排序函数,使得这个函数可以排序任意指定的数组
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{
	//趟数
	size_t i = 0;
	for (i = 0; i< sz - 1; i++)
	{
		//一趟冒泡排序的过程
		size_t j = 0;
		for (j = 0; j< sz - 1 - i; j++)
		{
			//判断
			//base为void*,需要强制类型转换为char*【仅为一个字节】,可以灵活运用;j * width:跳过的步长
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) >0)//用自定义的cmp函数来比较;
			{
				//交换
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}


void test1()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i< sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
//使用我们自己写的bubble_sort函数排序结构体数组
void test2()
{
	struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };
	int sz = sizeof(s) / sizeof(s[0]);
	//bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}

int main()
{
	test1();
	//test2();
	return 0;
}
四、以排序整形为例讲解qsort()函数

Ⅰ:定义一个降序的整形数组;

Ⅱ:求得整型数组的大小;

Ⅲ:进入bubble_sort()函数进行排序;

  Ⅲ①:理解整个bubble_sort函数;

  Ⅲ②:利用两层for循环来达到冒泡排序的效果;

  Ⅲ③:判断前两个元素的大小:将void*base 的指针强制类型转换为char*,而 j*width 则为一个数据的大小,利用cmp()函数进行比较;

Ⅲ④:实现cmp_int();整形比较的函数

  Ⅲ⑤:实现两个元素的交换;

Ⅳ:依照冒泡排序的思想,在bubble_sout()函数中不断排序,达到对整形数组排序的效果;

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前名称:C语言学习qsort()函数及模拟实现-全解析-创新互联
网站地址:http://chengdu.cdxwcx.cn/article/dgdieh.html