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

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;
}

猜你喜欢

转载自blog.csdn.net/Jinx_vt_Lin/article/details/85089179
今日推荐