• 奇葩函数-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;
    }
    

      

  • 相关阅读:
    Java第十三天,内部类
    Java第十二天,权限修饰符
    Java面向对象基础
    opencv配置(win10+VS2015+opencv3.1)
    malloc函数
    C++用new创建对象和不用new创建对象的区别解析
    字符串匹配KMP算法中Next[]数组和Nextval[]数组求法
    C++将一个数组内容赋给另一个数组
    C++中的const和指针组合
    通过图片对比带给你不一样的KMP算法体验
  • 原文地址:https://www.cnblogs.com/Juruo1103/p/10423012.html
Copyright © 2020-2023  润新知