快速排序——qsort(a, n, sizeof(int), cmp);

文章介绍了快速排序的概念、做法,以及如何在C语言中使用qsort函数进行排序。通过提供升序排列的cmp比较函数示例,展示了如何自定义排序规则。此外,还给出了一个使用贪心算法计算数列极差的问题解决代码,包括最大值和最小值的递归计算方法。
摘要由CSDN通过智能技术生成

定义:

通过一趟排序将要排序的数据分割成两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后按此方法对两部分数据分别进行快速排序,整个快速排序过程可用递归实现。

做法:

设要排序的数组是A[0].....A[n-1],首先任取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数放它前面,所有比它大的数放它后面,这个过程称为一趟快速排序。

野生方法:

让i 指关键数的右边一个,j指数组的最右边,先让i与关键数顺序比较,大于挪最右边,换j进行比较,小于挪最左边,再把i指向挪到下一个数,下一个数还是小于关键数就自动再往后移,直到所有数据都排好顺序。

使用方法:

使用到的是   sort(数组名,开始,结尾)函数,在stdlib.h头文件中。
有qsort()   //快速排序
qsort函数,也就是快速排序算法,在C的<stdlib>库中,需加入头文件#include <cstdlib> 或#include <stdlib.h>。

调用qsort函数需要写cmp比较函数。
给出按升序排列的例子:

int cmp(const void* a, const void* b)

{   return (int*)a - (int*)b;}

调用:
qsort(a, n, sizeof(int), cmp);  //a为数组,n为个数 


如果需要按照自己的意愿排列,那么同样重写cmp比较函数,就可以完成,和sort函数类似。时间复杂度为O(n log n),但是某些情况要比sort函数好。

例子:

将 n 个正整数作成的一个数列,进行如下操作:每一次删除其中的两个数 a 和 b,然后在数列中加入一个数a×b+1,如此下去直至数列中剩下一个数。

在所有按这种操作方式最后得到的数中,最大的记作 max,最小的记作 min,则该数列的极差定义为M=max-min,请你使用贪心算法设计编程输出他们的极差。

#include <stdio.h>
#include <stdlib.h>
/*********  Begin  **********/
int cmpmax(const void* x,const void*y){  //快速排序,从大到小排序
    return *(int *)y-*(int *)x;
}
int cmpmin(const void* x,const void*y){  //快速排序,从小到大排序
    return *(int *)x-*(int *)y;
}
int Min(int b[],int n){                 //求极小
    if(1==n){
        return b[0];
    }
    else{
        qsort(b,n,sizeof(int),cmpmin);  //快速排序法
        int min=b[n-1]*b[n-2]+1;
        b[n-2]=min;
        Min(b,n-1);                //递归
    }
}
int Max(int a[],int n){//求极大
    if(1==n){
        return a[0];
    }
    else{
        qsort(a,n,sizeof(int),cmpmax);//快速排序法
        int max=a[n-1]*a[n-2]+1;
        a[n-2]=max;
        Max(a,n-1);//递归
    }
}
void main()
{
	int i,num;
    scanf("%d",&num);
    int a[num];
    for (i=0;i<num;i++)
        scanf("%d",&a[i]);
    int b[num];
    for(int j=0;j<num;j++){
        b[j]=a[j];//复制数组,一个找max,一个找min
    }
    int max=Max(a,num);
    int min=Min(b,num);
    printf("Max=max-min=%d-%d=%d",max,min,max-min);
}
/*********  End **********/

更详细的快速排序可以参考链接:(4条消息) 排序——快速排序(Quick sort)_努力的老周的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值