如何使用qsort函数,以及模拟实现qsort函数

Holle, 各位小伙伴,今天呢我们给大家介绍一下qsort这一个函数是如何使用的,并且通过了解这个函数实现的原理进而来实现这一个函数。

qsort函数(以下内容参考cplusplus网站中对qsort函数的介绍)

qsort函数的用处

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));
对数组的元素进行排序

对 所指向的数组元素进行排序,每个元素的长度为字节,使用函数确定顺序。
此函数使用的排序算法通过调用指定的函数来比较元素对,并将指向元素的指针作为参数。
该函数不返回任何值,而是通过对数组的元素进行重新排序来修改所指向的数组的内容,如 所定义的那样。
等效元素的顺序未定义。

qsort函数包含的参数

基础

指向要排序的数组的第一个对象的指针,转换为 .void*

数字

数组中由 指向的元素数。
是无符号整数类型。basesize_t

大小

数组中每个元素的大小(以字节为单位)。
是无符号整数类型。size_t

比较

指向比较两个元素的函数的指针。
重复调用此函数来比较两个元素。它应遵循以下原型:qsort

 
int compar (const void* p1, const void* p2);


将两个指针作为参数(均转换为 const void*)。该函数通过返回(以稳定和传递的方式)来定义元素的顺序:

返回值意义
<0指向的元素位于指向的元素之前p1p2
0指向的元素等同于 指向的元素p1p2
>0指向的元素位于 指向的元素之后p1p2


对于可以使用常规关系运算符进行比较的类型,常规函数可能如下所示:compar

1
2
3
4
5
6
int compareMyType (const void * a, const void * b)
{
  if ( *(MyType*)a <  *(MyType*)b ) return -1;
  if ( *(MyType*)a == *(MyType*)b ) return 0;
  if ( *(MyType*)a >  *(MyType*)b ) return 1;
}

返回值

qsort函数没有返回值

使用qsort函数

利用qsort函数实现冒泡排序

#include <stdio.h>      
#include <stdlib.h>     /* qsort函数的实现要包含头文件stdlib.h */

int values[] = { 4, 10, 98, 70, 10, 36 };

int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

int main ()
{
  int n;
  qsort (values, 6, sizeof(int), compare);
  for (n=0; n<6; n++)
     printf ("%d ",values[n]);
  return 0;
}

利用qsort函数实现对结构体的排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu//这里我们在结构体中设定两个内容
{
	char name[20];
	int age;
};
//利用年龄排序
int cmp_struct_age(const void* p1, const void* p2)
{
	return  ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
//利用名字排序
int cmp_struct_name(const void* p1, const void* p2)
{
	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void test2()
{
	struct stu arr[] = { {"zhangsan", 20}, {"lisi", 36}, {"wagnwu", 18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_struct_age);//此处可以选择用哪种方式排序
}

int main()
{
	test2();
	return 0;
}

模拟qsort函数的实现

以模拟结构体排序为例

​
#include <stdio.h>
#include <string.h>
//进行相邻连个元素之间的交换
void swap(void* p1, void* p2, size_t wight)
{
	int i = 0;
	for (i = 0; i < wight; i++)
	{
		char tmp = *((char*) p1 + i);
		*((char*)p1 + i) = *((char*)p2 + i);
		*((char*)p2 + i) = tmp;
	}
}
//模拟qsort函数
void bulle(void* base, size_t sz, size_t wight, int(*cmp)(void*, void*))
{
	int i, j;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base + j * wight, (char*)base + (j + 1) * wight) > 0)
			{
                //在此处将base强制类型转化为char类型是因为,char类型运算时每次增减一个字节
                //便于进行找到型对应的元素
				swap((char*)base + j * wight, (char*)base + (j + 1) * wight, wight);
			}
		}
	}
}
struct stu
{
	char name[20];
	int age;
};
int cmp_struct_name(const void* p1, const void* p2)
{
	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void test2()
{
	struct stu arr[] = { {"zhangsan ", 18}, {"lisi", 36}, {"wangwu", 24}};
	int sz = sizeof(arr) / sizeof(arr[0]);
	bulle(arr, sz, sizeof(arr[0]), cmp_struct_name);
}
int main()
{
	test2();
	return 0;
}

​

OK,那么今天我们关于qsort函数的分享就到此为止啦!希望我今天的分享会给大家帮助🌹🌹🌹

下一篇再见啦!!!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值