qsort使用举例(qsort函数的模拟实现)

  • qsort可以排列任意类型的数据,对与qsort来说,它的使用方面就比较多,比如;1.使用qsort函数排序整形数据。2.使用qsort排序结构数据。3.qsort函数的模拟实现。
  • 它的基本写法为:qsort(void*base,(//指针,指向的是待排序数组第一元素)   size_num,(数组元素个数)   size_t size(//数组的元素大小)    int(*compar)(const void*p1,cost void*p2)(//函数指针--指向就是两个元素的比较函数));看着比较多,但很好理解。
  • 好的,首先我们来讲一讲1.使用qsort函数排序整形数据:大家都知道冒泡排序,我在前面也讲过冒泡排序,那是用一个bubble_sort这个函数来写的,比较麻烦,那么我们现在就用qsort来写一个冒泡排序,首先,还是把主函数写出来,代码为:
    int main()
    {
    	int arr[] = {1,3,2,4,5,8,9,6};
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	int i = 0;
    	qsort(arr, sz, sizeof(arr[0]), int_cmp);//这个就是利用qsort来写的
    	for (i = 0; i < sz; i++)
    	{
    		printf("%d", arr[i]);
    	}
    	printf("\n");
    		return 0;
    }

    然后,对qsort进行声明,来实现对qsort的使用,则代码为:

    int int_cmp(const void*p1,const void*p2)
    {
    	if (*(int*)p1 > *(int*)p2)
    		return 1;
    	else if (*(int*)p1 == *(int*)p2)
    		return 2;
    	else
    		return -1;
    }

    这样就呢个把代码写出来了,其实qsort函数的代码也可以简化,不需要这么麻烦,可以把{}里的数改写成

    int int_cmp(const void* p1, const void* p2)
    //还可以改写成这样
    {
    	return (*(int*)p1 - *(int*)p2);
    }

    是不是就简单了很多,这是因为做差就可以包含了其它的程序。这样是不是比用一般函数代码所用的代码少了很多,而且简单,明了。

  • 再来讲一讲2.使用qsort排序结构数据。这里就要用一下数组的知识了,我们要用一下前面所讲的结构体,你还知道吗?回想一下吧,结构数据:排列学生的名字和年龄,并输出。一样的,先创造一个结构体,用struct来创造,代码为:

    struct stu //学生
    {
    	char name[20];
    	int age;
    };

    然后,创造一个主函数,代码为:

    int main()
    {
    	test1();//用来年龄的排序
    	test2();//用来名字的排序
    	return 0;
    }

    然后,就是排序,在这里我们就不一一介绍了,我们全写出来,在慢慢分析,所对应的代码为:

    #include<string.h>
    //按照年龄先作比较
    int com_sture_age(const void* p1, const void* p2)
    {
    	return ((struct stu*)p1 - (struct stu*)p2);//作差
    }
    //再按照名字来作比较,但作名字时,要用到字符串作比较的特殊库函数:strcmp,
    //strcmp的头文件为:<string.h>
    int com_sture_name(const void* p1, const void* p2)
    {
    	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
    }
    //按照年龄来排序的
    void test1()
    {
    	struct stu age[] = { 20,30,16 };
    	int sc1 = sizeof(age) / sizeof(age[0]);
    	int j = 0;
    	for (j = 0; j < sc1; j++)
    	qsort(age, sc1, sizeof(age[0]), com_sture_age);
    	printf("%zd\n", age[j]);
    }
    //按照名字来排序的
    void test2()
    {
    	struct stu name[] = { {"zhangsan"},{"lizi"},{"wangwu"},{"zhoasi"}};
    	int sc2 = sizeof(name) / sizeof(name[0]);
    	int i = 0;
    	for (i = 0; i < sc2; i++)
    	qsort(name, sc2, sizeof(name[0]), com_sture_name);
    	printf("%zd\n", name[i]);
    }

    这个就是所对应的代码,虽然很长,但是很通俗易懂,就是理解qsort的使用

  • 最后来讲讲3.qsort函数的模拟实现,在这里还是要采用冒泡排序的方法来实现它。(在这里要使用void*的指针,)还是先把主函数写出来,则代码为:

    int main()
    {
    	int arr[] = { 1,3,2,4,5,8,9,6 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	int i = 0;
    	bubble(arr, sz, sizeof(arr[0]), int_comp);//用bubble创建一个函数模拟qsort
    	for (i = 0; i < sz; i++)
    	{
    		printf("%d", arr[i]);
    	}
    	printf("\n");
    	return 0;
    }

    接下来就是对bubble进行声明,代码为:

    void bubble(void* base,int count,int size,int(*cmp)(void *,void *))//函数指针回调
    {
    	int i = 0;
    	int j = 0;
    	for (i = 0; i < count - 1; i++)
    	{
    		for (j = 0; j < count - 1; j++)
    		{
    			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
    			{
    				_swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
    			}
    		}
    	}
    }

    函数指针回调的上一章的内容了。不知道的可以往前看一看,对于接下来的操作就是对_swap和int_cmp的声明,两个代码一起写,则代码为:

    int int_comp(const void*p1,const void*p2)
    {
    	return (*(int*)p1 - *(int*)p2);
    }
    void _swap(void* p1, void* p2, int size)
    {
    	int i = 0;
    	for (i = 0; i < size; i++)
    	{
    		char tmp = *((char*)p1 + 1);
    		*((char*)p1 + 1) = *((char*)p2 + 1);
    		*((char*)p2 + 1) = tmp;
    	}
    }

    这样就能很好的用回调函数,模拟实现qsort。

  • 以上三种就是理解好qsort的最好证明了。看似很复杂,其实也不简单,慢慢品味吧。

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值