zoukankan      html  css  js  c++  java
  • 奇葩函数-qsort

     非主流函数-qsort

    qsort函数是C语言stdlib.h里面的一个快速排序函数。由于它不是C++的STL,所以它比C++的std :: sort跑的快的多

    函数用法

    函数原型

    void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
    

      

    使用方法

    函数原型看不懂?我也看不懂。

    简单来说,这个函数是这样用的。

    这里面需要传进四个参数:需要排序的数组第一个元素的地址,总共需要排序的元素个数,每个元素的大小,比较函数。

    举个例子:假设你有这样一个数组

    int num[105];
    

      

    你从num[1]输入到了num[100],现在需要给这些数据排序,怎么用呢?

    qsort(num + 1, 100, sizeof(int), comp);//其中comp是你自己写的比较函数
    

      

    比较函数

    对于上面这个例子,我们的比较函数是这么写的

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

      

    这个函数规定传进来的参数类型为const void*,返回值为int,这两点不可改变,以返回值的正负来判断两个函数的大小。详细来说,返回值为负就相当于告诉qsort函数前一个参数小于后一个参数。

    不了解指针?那我们就事论事,说一下这个函数的通用写法。

    • 假设我们需要排序的参数类型是type,传进来的参数分别为const void *x和const void *y
    • 那么我们写作
      *(type*)x
      

        

    • 这样就相当于取出来了x自己的值
    • 那么现在就可以这么写
    • int comp(const void *a, const void *b) {
          return *(type*)a < *(type*)b ? -1 : 1;
      }
      

        

    • 就相当于让qsort从小到大排序。如果想要从大到小换成小于号即可
    • 结构体排序?我们也可以用原来的办法取出结构体,然后正常返回
    • 假设结构体名是Node,需要排序的参照成员名是mem,那么我们可以这么写
    • int comp(const void *a, const void *b) {
      	return (*(Node*)a).mem < (*(Node*)b).mem ? -1 : 1;
      }
      

        

    • 这样就相当于按照mem成员从小到大排序结构体了。

    完整代码

    P1177快速排序

    #include <cstdlib>
    #include <cstdio>
    
    int num[100005];
    
    int cmp(const void *a, const void *b) {
        return *(int*)a - *(int*)b;
    }
    
    int main() {
        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) scanf("%d", &num[i]);
        qsort(num + 1, n, sizeof(int), cmp);
        for (int i = 1; i <= n; i++) printf("%d ", num[i]);
        return 0;
    }
    

      

  • 相关阅读:
    zookeeper 4 letter 描述与实践
    zookeeper理论
    Zookeeper的功能以及工作原理
    zookeeper
    VMware安装、配置CentOS
    python安装requests (win7 & centos7)
    Centos 6.4 32位 gcc 升级(已验证)
    Centos6.4编译安装Node.js(已验证)
    使用supervisor提高nodejs调试效率 (已验证)
    tar.xz文件如何解压 (已验证)
  • 原文地址:https://www.cnblogs.com/Juruo1103/p/10423012.html
Copyright © 2011-2022 走看看