写了这么久的排序感觉还是用现成的最舒服。其实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);

生活不易,诸君共勉

 
01-22 06:59