zoukankan      html  css  js  c++  java
  • qsort排序(即快排)

    qsort是C语言中用二分法进行的快速排序,其时间复杂度为n*log(n);
    库函数名为:#include<stdlib.h>
    基本形式为:qsort(a,n,sizeof(..),cmp);
    1:对整形数组排序
      例如a[5]={1,4,3,5,2};
    用函数qsort(a,5,sizeof(a[0]),cmp);
    其中cmp为 函数为
    cmp(const void *a,const void *b)
    {
    return *(int *)a-*(int *)b;//要尽量强制转换类型
    }
    2:字符的排序
    其他和整形一样,函数为
    int cmp(const void *a,const void *b)
    {
    return *(char *)a-*(char *)b;
    }
    3:对于double型数据  稍有不同   原理同int这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,只能说fabs(a-b)<1e-20之类的这样来判断,所以这里只返回了1和-1。
    int cmp(const void * a, const void * b)
      {
      return((*(double*)a-*(double*)b>0)?1:-1);
      }
    4:对于二维数组的排序转化为结构体比较简单;
    5:对于结构体一级排序
    例:
    #include<stdio.h>
    #include<stdlib.h>
    struct coord //coord的意思是'坐标'
    {
    int x;
    int y;
    }s[100];
    int cmp(const void *a,const void *b)
    {
    return (* (struct coord *)a).y>(*(struct coord *)b).y?1:-1;//根据y的大小进行排序 ?1:-1 从小到大?-1:1从大到小
    }
    int main()
    {
    int i,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d%d",&s[i].x,&s[i].y);
    for(i=0;i<n;i++)
    printf("%d %d ",s[i].x,s[i].y);
    putchar('\n');
    qsort(s,n,sizeof(s[0]),cmp);
    for(i=0;i<n;i++)
    printf("%d %d ",s[i].x,s[i].y);
    return 0;
    }
    6:对于结构体二级排序
    #include<stdio.h>
    #include<stdlib.h>
    struct coord //coord的意思是'坐标'
    {
    int x;
    int y;
    }s[100];
    int cmp(const void *a,const void *b)
    {
    if((*(struct coord *)a).x!=(*(struct coord *)b).x)
    return (*(struct coord *)a).x>(*(struct coord *)b).x?1:-1; //按照x从小到大排序 当x相等时按照y从小到大排序
    else
    return (*(struct coord *)a).y>(*(struct coord *)b).y?1:-1;
    }
    int main()
    {
    int i,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d%d",&s[i].x,&s[i].y);
    for(i=0;i<n;i++)
    printf("%d %d ",s[i].x,s[i].y);
    putchar('\n');
    qsort(s,n,sizeof(s[0]),cmp);
    for(i=0;i<n;i++)
    printf("%d %d ",s[i].x,s[i].y);
    return 0;
    }
     7:对字符串进行排序 

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

    8:二维数组进行字符串排序

    比如char a[10][100];

    对字符串a[0],a[1]……a[9]按字典顺序排序

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

    {

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

    qsort(a,10,sizeof(char)*100,cmp);

    9:计算几何中求凸包的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;
    }

    此为自己总结,经过实验,修改了多次,和大家共享!如有错误 请指正。
  • 相关阅读:
    easyui tree:根据属性格式化树节点名称
    Druid执行多条SQL异常:Cause: java.sql.SQLException: sql injection violation, multi-statement not allow
    springmvc接收jquery提交的数组数据
    jquery easyui:tab自动加载第一个tab内容
    thymeleaf-extras-shiro
    Shiro:授权控制
    thymeleaf : EL1050E The arguments (...) for the constructor call are missing
    (转载)ibatis:解决sql注入问题
    05 Oracle process
    04 memory structure
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2384491.html
Copyright © 2011-2022 走看看