qsort()中cmp函数的一些使用方法(C语言)

作为个人的学习心得记录,写的不正确的地方欢迎指正啊!

一、基本形式

cmp作为一个比较函数,可以简单方便的对bsearch、qsort等函数提供交换依据。
它的基本形式为:

int cmp(const void *a ,const void *b);

可见:
1、cmp()会返回int型返回值;
2、cmp()带有两个指针型形式参数const void *
其中,const为一个限定词,含有const限定词的参数,尤其是以指针传递地址的参数,不会改变其原本的值。
void *,为一个无类型指针,既可以通过强制类型转换,使其转换为任意类型的指针,甚至直接取指向的数据值。

二、使用方法

对于qsort中

int cmp(const void *a ,const void *b)
{
	...
}

cmp()会有三种返回值(以qsort为例):
1、返回一个正数:a排列在b之后;
2、返回0:a、b相等;
3、返回一个负数:a排在b之前;

因此,我们可以由此得出一些基本的使用方法;

(一)对int数组升序排序

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

(二)对double数组升序排序
以上方法对double型则不适用,因为cmp返回值为int型,若两个小数差距极小,例如:a=0.15 ,b=0.14,将会被强制转换为0返回,不发生交换

int cmp(const void * a,const void *b)
{
    if( *( double* )a > *( double * )b )
        return 1;
    else if( *( double* )a < *( double * )b )
        return -1;
    return 0;
}

(三)对字符串按字典序排序

#include <string.h>
int cmp(const void *a ,const void *b)
{
	return strcmp( (char *)a , (char *)b );
}

例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a ,const void *b)
{
	return strcmp( (char *)a , (char *)b );
}
int main()
{
    char A[4][6]={
    "abcde",
    "aacde",
    "accde",
    "bcdef"
    };
    qsort(A,4,sizeof(A[0]),cmp);
    for(int i=0 ; i<4 ; i++)
        printf("%s\n",A[i]);
}
/*输出:
aacde
abcde
accde
bcdef
*/

(四)对结构体升序排序


typedef struct
{
    int A;
    double B;
    char C[];
}Sructure;

int cmp(const void * a,const void *b)
{
    //对int的引用
    return (*(Sructure *)a).A-(*(Sructure *)a).B;
   	//对double的引用
   	if( (*( Sructure* )a).B > (*( Sructure* )b).B )
        return 1;
    else  if( (*( Sructure* )a).B < (*( Sructure* )b).B )
        return -1;
    return 0;
    //对字符串字典序排序
   	return strcmp( (*(Sructure *)a).C , (*(Sructure *)b).C )
}

三、作为一个新手,极其欢迎大家补充!!!

  • 39
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
C语言qsort()函数是用来对数组进行排序的标准库函数,它的函数原型如下: ```c void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); ``` 其,最后一个参数"compar"是一个指向比较函数的指针,它的作用是用来指定数组元素的比较规则,从而实现排序。比较函数的原型如下: ```c int (*compar)(const void *, const void *) ``` 它接受两个指向待比较元素的指针,返回值表示两个元素的大小关系。如果第一个元素小于第二个元素,返回一个负整数;如果两个元素相等,返回0;如果第一个元素大于第二个元素,返回一个正整数。 下面是一个简单的例子,演示如何使用qsort()函数进行排序,并且自定义比较函数cmp(): ```c #include <stdio.h> #include <stdlib.h> int cmp(const void *a, const void *b) { return (*(int*)a - *(int*)b); } int main() { int arr[] = {3, 5, 1, 2, 4}; int n = sizeof(arr) / sizeof(arr[0]); qsort(arr, n, sizeof(int), cmp); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 在这个例子,我们首先定义了一个整型数组arr,并且使用sizeof()函数计算出数组的长度n。然后,我们使用qsort()函数将整型数组arr进行排序,排序时使用了自定义的比较函数cmp()。最后,我们遍历排序后的数组并且输出排序结果。 在比较函数cmp(),我们首先将指针a和指针b强转成int类型的指针,然后使用解引用符"*"获取指针指向的元素,最后返回两个指向的元素的差值。如果a指向的元素小于b指向的元素,返回负数,否则返回正数,如果相等,返回0。 在这个例子,我们将数组按照升序进行排序,输出结果为:1 2 3 4 5。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值