admin管理员组

文章数量:1794759

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

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 ) } 三、作为一个新手,极其欢迎大家补充!!!

本文标签: 使用方法函数语言qsortcmp