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

 

生活不易,诸君共勉

 
posted @ 2019-10-03 10:48  秦_殇  阅读(304)  评论(0编辑  收藏  举报