qsort用法示例

compare(void * ,size_t,size_t,int compare());
compare()函数的编写是关键。
com()需要自己编写也正是STL库函数灵活的一个特点。有了这个,可以很轻松的对字符串数组,二维字符串数组进行字典排序,可以对结构体按照关键字进行一级排序,可以为了使其稳定的二级或者多级排序。
QSORT()确实非常好!


No.2.最常见的,对int数组排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int s[10000],n,i;


int cmp(const void *a, const void *b)
{
     return(*(int *)a-*(int *)b);
}


int main()
{
     scanf("%d",&n);
     for(i=0;i<n;i++) scanf("%d",&s[i]);
   
     qsort(s,n,sizeof(s[0]),cmp);
   
     for(i=0;i<n;i++) printf("%d ",s[i]);
   
     return(0);
}


No.3.对double型数组排序,原理同int


这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,只能说fabs(a-b)<1e-20之类的这样来判断,所以这里只返回了1和-1
#include <stdio.h>
#include <stdlib.h>


double s[1000];
int i,n;


int cmp(const void * a, const void * b)
{
     return((*(double*)a-*(double*)b>0)?1:-1);
}


int main()
{
     scanf("%d",&n);
     for(i=0;i<n;i++) scanf("%lf",&s[i]);
   
     qsort(s,n,sizeof(s[0]),cmp);
   
     for(i=0;i<n;i++) printf("%lf ",s[i]);
   
     return(0);
}


No.4.对一个字符数组排序.原理同int
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


char s[10000],i,n;


int cmp(const void *a,const void *b)
{
     return(*(char *)a-*(char *)b);
}


int main()
{
     scanf("%s",s);
     n=strlen(s);
     qsort(s,n,sizeof(s[0]),cmp);
   
     printf("%s",s);
     return(0);
}


No.5.对结构体排序


注释一下.很多时候我们都会对结构体排序,比如校赛预选赛的那个樱花,一般这个时候都在
cmp函数里面先强制转换了类型,不要在return里面转,我也说不清为什么,但是这样程序会
更清晰,并且绝对是没错的. 这里同样请注意double返回0的问题


#include <stdio.h>
#include <stdlib.h>


struct node
{
     double date1;
     int no;
} s[100];


int i,n;


int cmp(const void *a,const void *b)
{
     struct node *aa=(node *)a;
     struct node *bb=(node *)b;
     return(((aa->date1)>(bb->date1))?1:-1);
}


int main()
{
     scanf("%d",&n);
     for(i=0;i<n;i++)
     {
         s[i].no=i+1;
         scanf("%lf",&s[i].date1);
     }
     qsort(s,n,sizeof(s[0]),cmp);
   
     for(i=0;i<n;i++) printf("%d   %lf\n",s[i].no,s[i].date1);
   
     return(0);
}


No.6.对结构体排序.加入no来使其稳定(即data值相等的情况下按原来的顺序排)


#include <stdio.h>
#include <stdlib.h>


struct node
{
     double date1;
     int no;
} s[100];


int i,n;


int cmp(const void *a,const void *b)
{
     struct node *aa=(node *)a;
     struct node *bb=(node *)b;
     if(aa->date1!=bb->date1)
         return(((aa->date1)>(bb->date1))?1:-1);
     else
         return((aa->no)-(bb->no));
}


int main()
{
     scanf("%d",&n);
     for(i=0;i<n;i++)
     {
         s[i].no=i+1;
         scanf("%lf",&s[i].date1);
     }
     qsort(s,n,sizeof(s[0]),cmp);


     for(i=0;i<n;i++) printf("%d   %lf\n",s[i].no,s[i].date1);


     return(0);
}


No.7.对字符串数组的排序(char s[][]型)


#include <stdio.h>
#include <string.h>
#include <stdlib.h>


char s[100][100];
int i,n;


int cmp(const void *a,const void *b)
{
     return(strcmp((char*)a,(char*)b));
}


int main()
{
     scanf("%d",&n);
     for(i=0;i<n;i++) scanf("%s",s[i]);


   
     qsort(s,n,sizeof(s[0]),cmp);
   
     for(i=0;i<n;i++) printf("%s\n",s[i]);
   
     return(0);
}


No.8.对字符串数组排序(char *s[]型)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


char *s[100];
int i,n;


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


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


int main()
{
     scanf("%d",&n);
     for(i=0;i<n;i++)
     {
         s[i]=(char*)malloc(sizeof(char*));
         scanf("%s",s[i]);
     }


     qsort(s,n,sizeof(s[0]),cmp);


     for(i=0;i<n;i++) printf("%s\n",s[i]);


     return(0);
}

评论

  1. 我更喜欢用sort函数,不过好像sort不能给二维数组排序。。。。

    回复删除

发表评论

此博客中的热门博文

Linux/ARM Page Table Entry 属性设置分析

由RFE指令引发的一串故事

Why cann’t we remove the ZONE_DMA from Linux