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

定义:

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

做法:

设要排序的数组是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博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注释如下: ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 100 // 声明常量 MAX_N,表示数组最大长度 int n; // 声明变量 n,表示数组长度 int ta[MAX_N], tb[MAX_N]; // 声明两个数组 ta 和 tb,长度为 MAX_N /* 自定义比较函数,用于 qsort 排序 */ int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } int main() { scanf("%d", &n); // 读入 n for (int i = 0; i < n; i++) { // 读入数组 ta scanf("%d", &ta[i]); } for (int i = 0; i < n; i++) { // 读入数组 tb scanf("%d", &tb[i]); } qsort(ta, n, sizeof(int), cmp); // 对数组 ta 进行排序 qsort(tb, n, sizeof(int), cmp); // 对数组 tb 进行排序 int ans = 0; // 声明变量 ans,表示比赛次数 int j = 0; // 声明变量 j,表示下标 for (int i = 0; i < n; i++) { // 从数组 ta 的最小值开始比较 if (ta[i] > tb[j]) { // 如果 ta 的马速度大于 tb 的马速度 ans++; // 比赛次数加一 j++; // 下标加一,继续比较下一个马匹 } } printf("%d\n", ans); // 输出比赛次数 return 0; } ``` 运行事例: 输入: ``` 5 1 3 2 4 5 2 4 5 1 3 ``` 输出: ``` 4 ``` 解释:田忌的马按照速度排序后为 1 2 3 4 5,齐王的马按照速度排序后为 1 2 3 4 5。田忌的第一匹马比齐王的第二匹马慢,所以比赛第一场使用田忌的第一匹马和齐王的第一匹马。田忌的第二匹马比齐王的第三匹马慢,所以比赛第二场使用田忌的第二匹马和齐王的第二匹马。田忌的第三、四、五匹马分别和齐王的第三、四、五匹马比赛。共进行了 4 场比赛。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值