qsort函数使用方法简介

背景

我们在编程的时候时常会使用到排序算法,库函数这时候就给我们很大的帮助,在需要排序算法时,我们可以引用qsort函数实现快速排序。

介绍

功能:使用快速排序例程进行排序
头文件:stdlib.h
用法:void qsort(void* base,size_t num,size_t width,int(__cdeclcompare)(const void,const void*));
参数:

  1. 待排序数组,排序之后的结果仍放在这个数组中
  2. 数组中待排序元素数量
  3. 各元素的占用空间大小(单位为字节)
  4. 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数)

qsort要求提供一个自己定义的比较函数。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。

以整型为例:

int cmp(void* a, void* b) {
    int* pa = (int*)a;
    int* pb = (int*)b;
    int num1 = *pa;
    int num2 = *pb;
    return num1 - num2;
}
1
2
3
4
5
6
7

可见,参数列表是两个空指针,现在他要去指向你的数组元素。所以转换为你当前的类型,然后取值。默认升序排列(从小到大),如果想降序排列返回*b-*a即可。

其他类型的用法分别为: 对char型数组排序(同int类型):

int cmp_char(void* a , void* b) 
{
    char* a = (char*)a;    
    char* b = (char*)b;
    return *a - *b;  
}
1
2
3
4
5
6

对double型数组排序:

int cmp_double(void* a , void* b)  
{   
    double* pa = (double*)a;
    double* pb = (double*)b;
    double num1 = *pa;
    double num2 = *pb;
    if(num1 - num2 > 0){
        return 1;
    }else{
        return -1;
    }
    //return *a > *b ? 1 : -1;   //特别注意
}
1
2
3
4
5
6
7
8
9
10
11
12
13

TIP

在对浮点或者double型的一定要用三目运算符或者使用分支循环,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系

对字符串进行排序:

int cmp_string(void* a , const void* b)  
{
    char* a = (char*)a;  
    char* b = (char*)b;
    return strcmp(a,b);
}
1
2
3
4
5
6

补充

对于qsort函数的具体使用方法只需要能够正确使用就可以,对于qsort函数的具体使用方法可以参考一个B站的视频,qsort函数的使用方法