qsort小总结

qsort,包含在stdlib.h头文件里,函数一共四个参数,没返回值.一个典型的qsort的写法如下

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

其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]
这样的表达式,这个问题下面有说明); 第二个参数是参与排序的元素个数; 第三个三数是
单个元素的大小,推荐使用sizeof(s[0])这样的表达式,下面也有说明 :) ;第四个参数就是
很多人觉得非常困惑的比较函数啦,关于这个函数,还要说的比较麻烦...

我们来讨论cmp这个比较函数(写成cmp是我的个人喜好,你可以随便写成什么,比如qcmp什么
的).典型的cmp的定义是

int cmp(const void *a,const void *b);
/*
#include <cstdio>
#include <cstring>
#include <cstdlib>

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);
}
*/
/*
#include <cstdio>
#include <cstdlib>

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);
     return ((node*)a)->date1 - ((node*)b)->date1;
}

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);
         
    if(((node*)a)->date1!=((node*)b)->date1)
         return(((((node*)a)->date1)>(((node*)b)->date1))?1:-1);
     else
         return((((node*)a)->no)-(((node*)b)->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);
}
*/
/*
5
1.1 2.2 1.1 3.3 0.0
5   0.000000
1   1.100000
3   1.100000
2   2.200000
4   3.300000

Process returned 0 (0x0)   execution time : 19.668 s
Press any key to continue.
*/
///对字符串数组的排序(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);
}

///对字符串数组排序(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);
}
*/

很久以前从csdn上粘下来的,不记得原作者是谁了。

posted @ 2018-01-09 19:08  深圳地铁Princess  阅读(112)  评论(0编辑  收藏  举报