C语言标准库函数qsort具体解释

1 函数简单介绍

功 能: 使用高速排序例程进行排序

头文件:stdlib.h

用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

參数: 1 待排序数组首地址

2 数组中待排序元素数量

3 各元素的占用空间大小

4 指向函数的指针,用于确定排序的顺序

2 基本使用方法

使用qsort()排序并用 bsearch()搜索是一个比較经常使用的组合,使用方便快捷。

qsort 的函数原型是void
__cdecl qsort (void *base,size_tnum,size_t width,int (__cdecl *comp)(const void *,const void*))

当中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比較函数。

比方:对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。

qsort(a,1000,sizeof(int),comp);

当中comp函数应写为:

int comp(const void *a,const void *b)

{

return *(int *)a-*(int *)b;

}qsort上面是由小到大排序,return
*(int *)b-*(int *)a; 为由大到小排序。

是对一个二维数组的进行排序:

int a[1000][2]; 当中依照a[0]的大小进行一个总体的排序,当中a[1]必须和a[0]一起移动交换。

qsort(a,1000,sizeof(int)*2,comp);

int comp(const void *a,const void *b)

{

return ((int *)a)[0]-((int *)b)[0];

}

qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件里,是依据二分发写的,其时间复杂度为n*log(n),其结构为:

void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,const void *));

当中:

*base 为要排序的数组

nelem 为要排序的数组的长度

width 为数组元素的大小(一字节为单位)

默认是从小到大排序的!

(* Comp)(const void *p1,const void *p2) 为推断大小函数的指针,这个函数须要自定义,假设p1>p2,函数返回-1;a<b,函数返回1;a==b函数返回0

排序方法有非常多种:选择排序,冒泡排序,归并排序,高速排序等。

看名字都知道高速排序 是眼下公认的一种比較好的排序算法(我没听说速度比这快的了,特殊场合例外),比选择排序,冒泡排序都要快。这是由于他速度非常快,所以系统也在库里实现这个算法,便于我们的使用。

这就是qsort。

qsort 要求提供一个比較函数,是为了做到通用性更好一点。比方你不只的是要排序一个数字而已,可能你要用来排序几个数字 ,比方有一个结构

struct num

{

int a;

int b;

};

然后我有一个num 类型的数组, num dddd[100];

我想给 dddd这个数组排序,那怎么办? 我想让 a +b 最大的num元素排在数组的最前面,那又怎么办?

这都能够通过定义比較函数来做到的。

比較函数的作用就是给qsort指明元素的大小是怎么比較的。

像这种比較函数 inline int MyCmp(const void* a, const void* b)

都是有两个元素作为參数,返回一个int值, 假设比較函数返回大于0,qsort就觉得 a>b , 假设比較函数返回等于0 qsort就觉得a 和b 这两个元素相等,返回小于零 qsort就觉得 a<b 。

qsort 知道元素大小,就能够把大的放到前面去。

假设你的比較函数放回本来应该是1 的(a>b),你比較函数却返回一个 -1 (小于零的)那么qsort觉得a<b 的,就把 b放到前面去,但实际上是a大于b的,所以就造成升降序的区别了。

3 相关举例

七种qsort排序方法

<本文中排序都是採用的从小到大排序>

一、对int类型数组排序

int num[100];

Sample:

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

{

return *(int *)a - *(int *)b; //强制转换类型

}

qsort(num,100,sizeof(num[0]),cmp);

二、对char类型数组排序(同int类型)

char word[100];

Sample:

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

{

return *(char *)a - *(char *)b;

}

qsort(word,100,sizeof(word[0]),cmp);

三、对double类型数组排序(特别要注意)

double in[100];

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

{

return *(double *)a > *(double *)b ? 1 : -1;

}

qsort(in,100,sizeof(in[0]),cmp);

四、对结构体一级排序

struct In

{

double data;

int other;

}s[100];

//依照data的值从小到大将结构体排序,关于结构体内的排序重要数据data的类型能够非常多种,參考上面的样例写

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

{

return (*(In *)a).data > (*(In *)b).data ? 1 : -1;

}

qsort(s,100,sizeof(s[0]),cmp);

五、对结构体二级排序

struct In

{

int x;

int y;

}s[100];

//依照x从小到大排序,当x相等时依照y从大到小排序

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

{

struct In *c = (In *)a;

struct In *d = (In *)b;

if(c->x != d->x) return c->x - d->x;

else return d->y - c->y;

}

qsort(s,100,sizeof(s[0]),cmp);

六、对字符串进行排序

struct In

{

int data;

char str[100];

}s[100];

//依照结构体中字符串str的字典顺序排序

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

{

return strcmp( (*(In *)a)->str , (*(In *)b)->str );

}

qsort(s,100,sizeof(s[0]),cmp);

七、计算几何中求凸包的cmp

int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的全部点,旋转角度排序

{

struct point *c=(point *)a;

struct point *d=(point *)b;

if( calc(*c,*d,p[1]) < 0) return 1;

else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //假设在一条直线上,则把远的放在前面

return 1;

else return -1;

}

PS:

当中的qsort函数包括在<stdlib.h>的头文件中,strcmp包括在<string.h>的头文件中

时间: 2024-10-20 23:07:50

C语言标准库函数qsort具体解释的相关文章

C语言标准库函数qsort详解

1 函数简介 功 能: 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *)); 参数: 1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序 2 基本用法 使用qsort()排序并用 bsearch()搜索是一个比较常用的组合,使用方便快捷. qsort 的函数原型是

C语言标准库函数strcpy与strcmp的简单实现

1 //C语言标准库函数strcpy的一种简单实现. 2 3 //返回值:目标串的地址. 4 5 //对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL. 6 7 //参数:des为目标字符串,source为原字符串. 8 9 char* strcpy(char* des,const char* source) 10 { 11 char* r=des; 12 13 assert((des != NULL) && (source != NULL)); 14

C语言标准库函数与功能讲解

1 数学函数 数学库函数声明在 math.h 中,主要有: abs(x) 求整型数x 的绝对值 cos(x) x(弧度)的余弦 fabs(x) 求浮点数x 的绝对值 ceil(x) 求不小于x 的最小整数 floor(x) 求不大于x 的最小整数 log(x) 求x 的自然对数 log10(x) 求x 的对数(底为10) pow(x, y) 求x 的y 次方 sin(x) 求x(弧度)的正弦 sqrt(x) 求x 的平方根 2 字符处理函数 在 ctype.h 中声明,主要有: int isdi

C语言的比较库函数--qsort

c语言中的库函数:qsort(int *base,int num,int width,int (*compare)(int *void,int *void)): 其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数. 比如:对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名. qsort(a,1000,sizeof(in

C语言标准库函数目录

不是软件产业的领头人,就永远只有跟随的份,不过也有好处,站在前人的肩膀上可以节省很多时间去做更有用的事.现在说说C语言的标准库函数.好多C语言库函数参考还是用的TC的库函数参考,因此特地把现在C语言(C99)标准库函数的24个头文件列表如下: assert.h  inttypes.h(C99) signal.h stdlib.hcomplex.h(C99) iso646.h(C95) stdarg.h string.hctype.h limits.h stdbool.h tgmath.h(C99

库函数qsort使用示范

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 struct Struction 6 { 7 double one; 8 int another; 9 }; 10 11 int CmpInt_1(const void *a,const void *b) 12 { 13 return *(int*)a - *(int*)b; 14 } 15 16 int CmpInt_2(const

bsearch

C语言中 bsearch 包含在<stdlib.h>头文件中,此函数可以根据你给的条件实现二分查找,如果找到元素则返回指向该元素的指针,否则返回NULL:对于有多个元素匹配成功的情况,bsearch()未定义返回哪一个.使用 bsearch 函数也要自己定义比较子函数. 函数原型 void *bsearch(const void *key, const void *base, size_t num, size_t size, int (*cmp)(const void *,const void

C语言qsort

C/C++中有一个快速排序的标准库函数 qsort ,在stdlib.h 中声明,其原型为: void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *)); 使用该函数,可以对任何类型的一维数组排序.该函数参数中,base 是待排序数组的起始地址,nelem 是待排序数组的元素个数,width 是待排序数组的每个元素的大小(以字节为单位),最后一个参数

strcpy c标准库函数

C语言标准库函数strcpy,把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间. 已知strcpy函数的原型是: char *strcpy(char *dst, const char *src); 实现strcpy函数 解释为什么要返回char * 假如考虑dst和src内存重叠的情况,strcpy该怎么实现 1.strcpy的实现代码 char * strcpy(char *dst,const char *src) //[1] { assert(dst != NUL