zoukankan      html  css  js  c++  java
  • qsort和sort学习与比较

    1.qsort函数:

    : void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));

    : 使用快速排序例程进行排序

    参 数:

    1 待排序数组首地址

    2 数组中待排序元素数量

    3 各元素的占用空间大小

    4 指向函数的指针,用于确定排序的顺序

    明:qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)。

    qsort要求提供的函数是需要自己定义的一个比较函数,比较函数使得qsort通用性更好。有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。
    如int cmp(const void *a, const void *b)中有两个元素作为参数(参数的格式不能变的。)返回一个int值,如果比较函数返回大于0,qsort就认为a > b,返回小于0,qsort就认为a < b。qsort知道元素的大小了,就可以把大的放前面去。如果你的比较函数返回本来应该是1的(即a > b),而却返回-1(小于0的数),那么qsort认为a < b,就把b放在前面去,但实际上是a > b的,所以就造成了降序排序的差别了。简单来说,比较函数的作用就是给qsort指明元素的大小事怎么比较的。

    2.qsort中几种常见的cmp函数:

    一、对int类型数组排序
    int num[100];
    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];
    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);

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

    3.sort和qsoort比较

    1.cmp函数和qsort中cmp函数的不同

    int cmp(const int &a,const int &b)

    {

      return a>b

    }

    Sort中的cmp函数参数可以直接是参与比较的引用类型。

    2cmp函数比较时qsort用“-”,而sort用”>”.这也是一个重要的区别。

    3sort函数是c++中标准模板库的的函数,在qsort()上已经进行了优化,根据情况的不同可以采用不同的算法,所以较快。在同样的元素较多和同样的比较条件下,sort()的执行速度都比qsort()要快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。使用时需调用<algorithm>
    sort(begin(),end(),cmp),

  • 相关阅读:
    LeetCode 32. 最长有效括号(Longest Valid Parentheses)
    LeetCode 141. 环形链表(Linked List Cycle)
    LeetCode 160. 相交链表(Intersection of Two Linked Lists)
    LeetCode 112. 路径总和(Path Sum)
    LeetCode 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)
    LightGBM新特性总结
    sql service 事务与锁
    C#泛型实例详解
    C# 中的委托和事件(详解)
    C# DateTime日期格式化
  • 原文地址:https://www.cnblogs.com/BeyondAnyTime/p/2513776.html
Copyright © 2011-2022 走看看