【C补充】qsort函数 —— 数组元素排序

20 篇文章 1 订阅

qsort函数位于 stdlib.h 的头文件中。

一、函数原型

1.1 qsort函数

void qsort(void* base, size_t n, size_t size, int (*compar)(const void*,const void*));
  • base —— 指向目标数组首地址的指针,转换为 void* 类型;
  • n —— 目标数组的元素个数,size_t 为无符号整型;
  • size —— 目标数组各个元素所占的字节数;
  • compar —— 指向比较两元素的函数的指针,该函数会被 qsort 函数反复调用来比较两元素;

1.2 元素比较函数 —— compar

1.2.1 函数原型

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

函数参数为两个指针,转换为 void* 类型。

1.2.3 功能

返回值含义
< 0p1 指向的元素放在p2前面
0p1 指向的元素与p2等价
> 0p1 指向的元素放在p2后面

1.2.2 函数举例

//举例1 —— 常用
int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );				//强制类型转换
}

//举例2
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;
}

//举例3:字符串数组排序
int compar(const void *s1, const void *s2)
{
	return strcmp(*(char**)s1, *(char**)s2);
}
  • 举例1中,整数相减可能导致数据溢出,因此使用 if 语句来比较 *(int*)a*(int*)b的值更安全


二、函数功能

  • 对 base 指向的数组的 n 个元素进行排序,每个元素大小为字节长,使用 compar函数确定顺序。
  • 此函数使用的排序算法是通过调用比较函数来比较一对数组元素,以指针作为比较函数的参数;
  • 此函数无返回值,但会修改 base 所指向的数组的内容,并按照 compar 的定义对其元素进行重新排序;
  • 等价元素的顺序未被定义。


三、举例

3.1 int型数组重排序

#include <stdio.h>      // printf
#include <stdlib.h>     // qsort

int values[] = { 40, 10, 100, 90, 20, 25 };
//比较函数
int compare (const void * a, const void * b)
{
	return ( *(int*)a - *(int*)b );
}

int main ()
{
	int n;
	qsort (values, 6, sizeof(int), compare);	//qsort函数的调用
  	for (n=0; n<6; n++)
    	printf ("%d ",values[n]);

	printf("\n");

  return 0;
}

输出结果:
请添加图片描述

3.2 字符串重排序

#include <stdio.h>
#include <stdlib.h>

int compar(void* a, void* b);

int main ()
{

	char a[6] = {'v', 'a', 'f', 'd', 't', '\0'};
	qsort(a, 5, sizeof(char), compar);
	printf("%s\n", a);
	
	return 0;
}
//排序规则函数
int compar(void* a, void* b)
{
	return (*(char*)a - *(char*)b);
}

输出结果:
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值