qsort()  应该就是用的快排。貌似是以数据块的方式移动数据,速度较快。

原型:

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

解释:    qsort ( 数组名 ,元素个数,元素占用的空间(sizeof),比较函数)

比较函数是一个自己写的函数  遵循 int com(const void *a,const void *b) 的格式。

当a b关系为 >  <  = 时,分别返回正值 负值 零 (或者相反)。

使用a b 时要强制转换类型,从void * 转换回应有的类型后,进行操作。

数组下标从零开始,个数为N, 下标0-(n-1)。

示例:

int nn[100],n=100;

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

{

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

}   

qsort((void *)nn,n,sizeof(int),com);

相关:

为什麽你必须给予元素个数?(因为阵列不知道它自己有多少个元素)为什麽你必须给予 double 的大小?(因为 qsort 不知道它要排序的单位是 doubles.)为什麽你必须写那个丑陋的、用来比较 doubles 数值的函式?(因为 qsort 需要一个指标指向某个函式,因为它不知道它所要排序的元素型别)为什麽 qsort 所使用的比较函式接受的是 const void* 引数而不是 char* 引数?(因为 qsort 可以对非字串的数值排序)Bjarne Stroustrup

 

 

一、对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 - *(int *)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);

自己写一个纯字符串的:(temp是二维的字符串数组,j是一共需排序的字符串个数)

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

{

   return strcmp((char*)a,(char*)b);

}

    qsort(temp, j,sizeof(temp[0]),cmpstr);

七、计算几何中求凸包的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;

}

qsort()是c程序库stdlib.h中的一个函数,需要比较函数完成排序;

sort()是STL中的标准算法。

#include<stdlib.h>

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

{

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

}

    .

    .

     .

qsort(q,n,sizeof(int),cmp);

    .

    .

    .

}

qsort对一维数组和字符串数组的排序:

#include "stdio.h"

#include "stdlib.h"

int a[100];

int cmp(const void *p,const void *q)

{

    return (*(int*)p)-*((int*)q);

}

int main()

{

    int n;

    scanf("%d",&n);

    for(int i=0;i<n;i++)

        scanf("%d",&a[i]);

    qsort((void*)a,n,sizeof(a[0]),cmp);

    for(int i=0;i<n;i++)

      printf("%d\n",a[i]);

    //while(1);

    

int cmp(const void *p,const void *q)

{

    return strcmp((char*)p,(char*)q);

}

int main()return 0;

}

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

char a[20005][25];

{

    int n,m,i,j;

    while(1)

    {

            scanf("%d%d",&n,&m);

            if(n==0&&m==0) break;

            for(i=0;i<n;i++)

            {

               scanf("%s",a[i]);

            }

            qsort((void*)a,n,sizeof(a[0]),cmp);

            for(i=0;i<n;i++)

               printf("%s\n",a[i]);

    }

}