C语言 qsort函数及其实现

认识qsort函数

首先调用时先引头文件#include<stdlib.h>
base是数组首元素,num是数组长度,width是数组中一个元素占字节的大小,compare是一个比较函数,来确定比较的方式,若大于则返回正数,小于返回负数,相等返回0
在这里插入图片描述
在这里插入图片描述

关于cmp函数

由于根据声明发现此处的e1,e2参数都是void*类型的指针,而此种类型的指针是不能解引用和++/–的,所以我们在比较时都要进行强制类型转换

typedef struct Stu
{
    char name[20];
    int age;
    float score;
}STU;

int char_cmp(const void* e1,const void *e2){
    return strcmp((char *)e1, (char *)e2);//比较字符串大小
}
int float_cmp(const void*e1,const void *e2){
    return *((float *)e1) - *((float *)e2);//比较浮点型大小
}
int struct_cmp(const void*e1,const void *e2){
    return ((STU*)e1)->age - ((STU*)e2)->age;//比较结构体中age的大小
}
int int_cmp(const void *e1,const void *e2){
    return *((int *)e1) - *((int *)e2);//比较整型大小
}

特别注意,如要实现升降序
在这里插入图片描述

int int_cmp1(const void *e1,const void *e2){
    return *((int *)e1) - *((int *)e2);//升序
}
int int_cmp2(const void *e1,const void *e2){
    return *((int *)e2) - *((int *)e1);//降序
}

实现qsort函数(此处采取冒泡排序,后续补充快速排序)

void my_swap(char *e1,char *e2,int width){
    int i = 0;
    for (i = 0; i < width; i++){//因为我们只能获得j号元素的首地址,此处循环意义在于对于width个字节实现挨个交换
        char temp = *e1;
        *e1 = *e2;
        *e2 = temp;
        e1++;
        e2++;
        }
}

void my_qsort(void* base,size_t size,size_t width,int (*cmp)(const void* e1,const void *e2)){
    int i = 0, j = 0;
    for (i = 0; i < size - 1;i++){
        int flag=1;
        for (j = 0; j < size - 1 - i;j++){//此处仿照冒泡
            if(cmp((char *)base+j*width,(char *)base+(j+1)*width)>0){//(char *)的强制类型转换为了实现一个字节一个字节的加减,+j*width可以找到第j号元素的首地址
                my_swap((char *)base + j * width, (char *)base + (j + 1) * width, width);//此处实现交换
                flag=0;
            }
        }
        if(flag==1){
        break;
        }
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值