快速排序API

qsort函数用于对一维数组进行排序,接受数组基地址、元素数量、元素大小和自定义比较函数。比较函数返回值决定排序顺序,如返回值小于0,则p1在p2前。示例中展示了如何实现递增、递减排序及特定规则排序。最后,文章提供了一个找出排序后相邻元素最大差值的例子。
摘要由CSDN通过智能技术生成

API-qsort

排序API的作用就是传入一个一维数组,并且按照给定的规则就地排序

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

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

qsort的调用

例如我们对如下数组进行排序

int a [5]={1,2,4,3,5};

就可以怎么写

void qsort(void*base,5,sizeof(int),cmp);

这样就能将该数组变为从一到五的顺序

其中 sizeof(int)就代表了单个数组元素的字节数,5 则代表了数组的大小,总的字节数就是两者的乘积。而 cmp 是一个比较数,是需要我们自己实现的,它决定了数组是递增排序 还是 递减排序,还是其它的排序方式(比如奇数排前面,偶数排后面,等等)接下来,我们来看看 cmp 函数的实现方式。

比较函数

int compar(const void *p1, const void *p2);

如果 compar 返回值小于0,则 p1 所指向元素会被排在 p2 所指向元素的左面

如果 compar 返回值等于0,则 p1 所指向元素与 p2 所指向元素的顺序不确定

如果 compar 返回值大于0,则 p1 所指向元素会被排在 p2 所指向元素的右面

那么如果我们需要写一个递增的排序 可以这样写

int cmp(const void *p1,const void *p2) {
    int v1 = *(int*)p1;
    int v2 = *(int*)p2;
    if (v1>v2) {
         return -1;
  }else if(v1<v2) {
        return 1;
    }
    return 0;
}

(1)需要和系统给定的函数原型保持一致,由于需要适配任何类型,所以用空指针 void * 做为参数类型

(2) p1 强制转换成数组元素的指针类型,然后再解引用 变成数组元素的值;

(3) p2 强制转换成数组元素的指针类型,然后再解引用 变成数组元素的值;

如果确定数组的数据相减不会超过32位整型,可以简化写法

int cmp(const void *p1, const void *p2) {
    return (*(int *)p2) - (*(int *)p1);
}

当然也可以通过交换p1,p2的写法 变为递减

如果要求偶数排前面,奇数排后面 可以用下面的写法

int Qua(int x) {
    return x % 2;
}
int cmp(const void *p1, const void *p2) {
    return Qua(*(int *)p1) - Qua(*(int *)p2);
}

例题:

给定一个无序数组,求排序后相邻元素的最大差值

int cmp(const void *p1, const void  *p2) {
    return *(int*)p1 - *(int*)p2;
}
int main(int * nums, numsSize) {
    int i = 0; max = 0;
    qsort(nums,numsSize,seizeof(int),cmp);
    for(i=0;i<numsSize;++i){
        if(nums[i]-nums[i-1]>max){
             max=nums[i]-nums[i+1];
        }
    }
    return max;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你怎么睡得着的!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值