【学习记录】C语言库函数qsort( )使用

C库函数_qsort( )

qsortstdlib.h中的函数,因此使用前需要声明:

#include <stdlib.h>

qsort的函数声明如下:

void qsort(void *base, size_t nitems,size_t size, int (* compar)(const void *, const void *));

格式

qsort包含四个参数,分别是:

  • 数组名
  • 元素个数(从前往后计算)
  • 数组元素所占字节
  • 排序原则(递增递减奇偶交叉等)
int cmp(const void *a,const void *b) {
	return *(int*)a-*(int*)b;
}
qsort(num, n, sizeof(int), cmp);

第四个cmp是比较函数指针,通过cmp返回的参数来确定排序规则,其中cmp函数的参数const void *a,const void *b表示ab的类型是未确定的,再return中强制转换成int类型,其中*(int*)a-*(int*)b表示递增顺序,递减就是将ab换位

不同类型的排序

  1. 整型

    int cmp(const void *a,const void *b){
        return *(int*)a-*(int*)b;
    }
    
  2. 浮点数

    int cmp(const void *a,const void *b){
        return *(double*)a>*(double*)b?1:-1;
    }
    
  3. 字符(char)

    int cmp(const void *a,const void *b){
        return *(char*)a-*(char*)b;
    }
    
  4. 结构体

    struct node{
        int i;
        double j;
        char k;
    }
    int cmp(const void *a,const void *b){
        return *(*(node*)a).i-*(*(node)b).i;
    }
    

下面是一段使用qsort()函数的示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义结构体
struct MyStruct {
    int i;
    double j;
    char k;
};

// 比较函数 for int
int compare_int(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

// 比较函数 for double
int compare_double(const void *a, const void *b) {
    double diff = (*(double *)a - *(double *)b);
    if (diff > 0) return 1;
    if (diff < 0) return -1;
    return 0;
}

// 比较函数 for char
int compare_char(const void *a, const void *b) {
    return (*(char *)a - *(char *)b);
}

// 比较函数 for struct (按 i 排序)
int compare_struct(const void *a, const void *b) {
    return ((struct MyStruct *)a)->i - ((struct MyStruct *)b)->i;
}

int main() {
    // 示例数据
    int int_array[] = {5, 2, 9, 1, 5, 6};
    double double_array[] = {3.2, 1.5, 4.8, 1.2, 5.7};
    char char_array[] = {'d', 'a', 'c', 'b', 'e'};
    struct MyStruct struct_array[] = {
        {3, 2.5, 'a'},
        {1, 3.2, 'b'},
        {4, 1.1, 'c'},
        {2, 4.4, 'd'}
    };

    // 计算数组长度
    int int_len = sizeof(int_array) / sizeof(int_array[0]);
    int double_len = sizeof(double_array) / sizeof(double_array[0]);
    int char_len = sizeof(char_array) / sizeof(char_array[0]);
    int struct_len = sizeof(struct_array) / sizeof(struct_array[0]);

    // 对 int 数组进行排序
    qsort(int_array, int_len, sizeof(int), compare_int);
    printf("Sorted int array: ");
    for (int i = 0; i < int_len; i++) {
        printf("%d ", int_array[i]);
    }
    printf("\n");

    // 对 double 数组进行排序
    qsort(double_array, double_len, sizeof(double), compare_double);
    printf("Sorted double array: ");
    for (int i = 0; i < double_len; i++) {
        printf("%.2f ", double_array[i]);
    }
    printf("\n");

    // 对 char 数组进行排序
    qsort(char_array, char_len, sizeof(char), compare_char);
    printf("Sorted char array: ");
    for (int i = 0; i < char_len; i++) {
        printf("%c ", char_array[i]);
    }
    printf("\n");

    // 对结构体数组进行排序
    qsort(struct_array, struct_len, sizeof(struct MyStruct), compare_struct);
    printf("Sorted struct array (by i): ");
    for (int i = 0; i < struct_len; i++) {
        printf("(%d, %.2f, %c) ", struct_array[i].i, struct_array[i].j, struct_array[i].k);
    }
    printf("\n");

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值