SDUT3401数据结构实验之排序四:寻找大富翁

本文深入探讨了C语言中快速排序算法的实现方法,重点介绍了stdlib库中的qsort函数使用技巧,包括其参数详解和自定义比较函数的编写,通过具体实例展示了如何利用qsort进行高效的数据排序。

c中的快排

此题出题者本意应该是让我们用堆排序去做,但是鄙人只知何为堆,不知如何做,故投机取巧,用了c语言中的快排qsort();
这个快排在stdlib头文件下
格式为
qsort(数组的起始地址即数组名,元素的个数,每个元素的大小(字节数),自定义函数(指向函数的方向指针,用于排序和决定怎么排))

*> compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void 型转换成实际类型,见下文。

int compar(const void *p1, const void *p2);
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面
因此,如果想让qsort()进行从小到大(升序)排序,那么一个通用的compar函数可以写成这样:

此处借鉴了一位大哥的博客,特此发出链接,以表敬意:详细的qsort讲解

再就是此题亦限时,需加一句 ios::sync_with_stdio(false); 以防超时。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>

using namespace std;

int a[1000010];

int cmp(const void *a,const void *b){
    return *(int *)b - *(int *)a;
}

int main()
{
    ios::sync_with_stdio(false);
    int n,m,x;
    while(cin>>n>>m){
    int j = 0;
    for(int i=0; i<n; i++){
        cin>>x;
        if(j<m)
            a[j++] = x;
        else{
            int d = 0;
            for(int l=1; l<m; l++){
                if(a[d]>a[l])
                    d = l;
            }
            if(a[d]<x)
                a[d] = x;
        }
    }
    qsort(a,m,sizeof(a[0]),cmp);
    for(int i=0; i<m; i++){
        if(i==m-1)
            cout<<a[i]<<endl;
        else
            cout<<a[i]<<" ";
    }
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值