C语言备忘录——qsort

时间:2019-10-03
本文章向大家介绍C语言备忘录——qsort,主要包括C语言备忘录——qsort使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

  写了这么久的排序感觉还是用现成的最舒服。其实C语言其实自己带了一个快速排序在stdlib 库里,但是其函数调用的接口过于复杂,所以让人望而却步。为了加深自己的记忆,所以写下这篇博客

先来看一下函数原型

_CRTIMP void __cdecl qsort(void*, size_t, size_t, int (*)(const void*, const void*))

  看上去就很复杂 其实 CRTIMP仅仅是一个宏定义(不明白也没啥)
  其实际意义如下

    C -- C语言
    R -- run 运行
    TIM -- time 时侯
    P -- 参数

   

 __cdecl 也是个系统预定义的宏。(好像是支持,不定参数输入,例如printf,在这里应该不是这个意思,感兴趣的自行度娘)。

  void 返回 NULL,qsort函数名。
括号里:
  第一个参数是代表任意数据类型的首地址;
  第二个参数是代表任意数据类型的所用空间,即长度;
  第三个参数是代表数据类型的大小;
  第四个参数是排序方式,最麻烦的就在这里了,我们得写一个比较函数cmp()。返回 1 从小到大,返回-1,从大到小

理论不讲太多,直接看如何使用:
  
一:整数比较
int num[100]; 
 
int cmp ( const void *a , const void *b ) 
{ 
  return *(int *)a > *(int *)b ? 1 : -1; 
} 
qsort(num,100,sizeof(num[0]),cmp); 

部用减法,怕数据溢出。

二、Char型比较

1 char word[100]; 
2 
3 int cmp( const void *a , const void *b ) 
4 { 
5   return *(char *)a > *(char *)b 1 ? -1; 
6 } 
7  
8 qsort(word,100,sizeof(word[0]),cmp);

 三、浮点型比较

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);

四、结构体比较

typedef double ElemtType
struct In 
{ 
   ElemtTypedata; 
   int other; 
}s[100];
 
int cmp( const void *a ,const void *b) 
{ 
  return (*(struct In *)a).data > (*(struct 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 = (struct In *)a; 
  struct In *d = (struct 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( (*(struct In *)a)->str , (*(struct In *)b)->str ); 
} 
qsort(s,100,sizeof(s[0]),cmp);

生活不易,诸君共勉

 

原文地址:https://www.cnblogs.com/daker-code/p/11619299.html