C中的qsort函数

C中的qsort函数
一、简介
 
原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
功 能: 使用快速排序例程进行排序
 
参 数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序
说明:qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)。
     qsort要求提供的函数是需要自己定义的一个比较函数,比较函数使得qsort通用性更好。有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。
     如int cmp(const void *a, const void *b)中有两个元素作为参数,返回一个int值,如果比较函数返回大于0,qsort就认为a > b,返回小于0qsort就认为a < b。qsort知道元素的大小了,就可以把大的放前面去。如果你的比较函数返回本来应该是1的(即a > b),而却返回-1(小于0的数),那么qsort认为a < b,就把b放在前面去,但实际上是a > b的,所以就造成了降序排序的差别了。
     简单来说,比较函数的作用就是给qsort指明元素的大小是怎么比较的。
 
二、使用举例(MinGW5测试通过)
 
1、对一维数组排序:
   
 
2、对字符串排序:
  
 
01 #include <stdio.h> 

02 #include <stdlib.h> 

03    

04 typedef char Element_type; 

05    

06 Element_type list[] = "djfkwjefklwefagj";  

07    

08 int Comp(const void *p1,const void *p2) 

09 { 

10     //降序排序 

11     return strcmp((char *)p2,(char *)p1); 

12     //升序排序 

13     //return strcmp((char *)p1,(char *)p2); 

14 } 

15    

16 int main(void) 

17 { 

18     puts("排序前:"); 

19     puts(list); 

20     printf("\n"); 

21        

22     //考虑还有字符串结束符,这里元素个数别忘减1 

23     qsort(list, sizeof(list) / sizeof(Element_type) - 1, sizeof(Element_type), Comp); 

24     system("pause"); 

25        

26     puts("排序后:"); 

27     puts(list); 

28     printf("\n"); 

29        

30    

31     return 0; 

32 } 


3、按结构体中某个关键字排序(对结构体一级排序):
 
01 #include <stdio.h> 

02 #include <stdlib.h> 

03    

04 struct Node 

05 { 

06     double data; 

07     int other; 

08 }s[100]; 

09    

10 int Comp(const void *p1,const void *p2) 

11 { 

12     return (*(Node *)p2)->data - (*(Node *)p1)->data; 

13 } 

14    

15 int main(void) 

16 { 

17     puts("排序前:"); 

18     //code 

19     printf("\n"); 

20        

21     qsort(s, 100, sizeof(s[0]), Comp); 

22     system("pause"); 

23        

24     puts("排序后:"); 

25     //code 

26     printf("\n"); 

27    

28     return 0; 

29 } 

4、按结构体中多个关键字排序(对结构体多级排序)[以二级为例]:
 
1 struct Node 

2 { 

3    int x; 

4    int y; 

5 }s[100];//按照x从小到大排序,当x相等时按y从大到小排序 

 
1 int Comp(const void *p1,const void *p2) 

2 { 

3    struct Node *c = (Node *)p1; 

4    struct Node *d = (Node *)p2; 

5     

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

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

8 } 

5、对结构体中字符串进行排序:
 
01 struct Node 

02 { 

03     int data; 

04     char str[100]; 

05 }s[100]; 

06    

07 //按照结构体中字符串 str 的字典序排序 

08 int Comp(const void *p1,const void *p2) 

09 { 

10     return strcmp((*(Node *)p1)->str,(*(Node *)p2)->str); 

11 } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值