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

  

posted @ 2019-02-23 16:06 Noire02 阅读(...) 评论(...) 编辑 收藏
Live2D