寒假集训第四天——排序

30 篇文章 0 订阅

今天讲了排序,都没听进去,说说目前会的排序吧

冒泡是使用最平凡的的排序方式,但是一旦数的大小超过10000的话,一般不考虑用冒泡了。。。

代码就不贴了,下面是选择排序的代码。。。

#define swap(x,y,t) ((t) = (x),(x) = (y),(y) = (t))//使用宏定义方式
void selectSort(int arr[],int n)
{
    int i,j,min,temp;
    for(i = 0; i < n - 1; i++)
    {
        min = i;
        for(j = i + 1; j < n; j++)
            if(arr[min] > arr[j])
                min = j;
        swap(arr[i],arr[min],temp);
    }
}

重点是快速排序。。。

int one(int arr[],int l,int r)//一次划分
{
    int key=arr[l];
    while(l<r)
    {
        while(l<r&&arr[r]>=key)r--;
        arr[l]=arr[r];
        while(l<r&&arr[l]<=key)l++;
        arr[r]=arr[l];
    }
    arr[l]=key;
    return l;
}
void Qsort(int arr[],int l,int r)
{
    if(l<r)
    {
        int p=one(arr,l,r);
        Qsort(arr,l,p-1);
        Qsort(arr,p+1,r);
    }
}

至于归并排序,硬是不想用。。。


至于集训的题目。。。就贴一题吧。

实况球员综合能力大比拼

Time Limit: 1000MS Memory limit: 65535K

题目描述

大家都应该听说过实况足球吧,如果这个没听说过的话,大家应该听说过中国足球吧,无人不知无人不晓的神一样的队伍。

    其实我们今天要讨论的话题主要是实况足球这个游戏,模拟的是整个足球界的所有球队,当然对于开发者能够把中国足球加进去表示非常感激。

每支球队都有若干名球员,每个球员又有若干种能力,当然不同的球员的能力是不同的。我们关注的是球员的几项能力:速度,力量,技巧,视野,进攻,防守,团队配合能力。每种能力都有一个比重系数,当然对于不同的球队,各项能力所占的比重系数可能是不一样的,今天我们希望对那些著名球员们按综合能力进行一下排名,如果出现综合能力值相同的球员按照七项能力从前到后高的优先,如果仍旧有相同的则按名字的字典序从小到大排序。综合能力的计算方法是把各个能力按比重系数加权求和,所得结果即为该球员的综合能力值。

 

输入

    多组输入,相邻两组数据用空行隔开。每组输入的第一行为该球队球员各项能力所占的比重系数 ,7 个整数( [1,10] ),分别对应题目描述中的 7 项能力,用空格隔开。第二行是一个正整数 N ( 0 < N < 50 ),代表该球队要参与排名的球员总数,接下来 N 行,每行的有一个球员的名字,名字中间可能有空格,长度不超过 20 。再接下来 N 行,每行有一个跟上面 N 行中每行相对应的那名球员的各项能力的数据,每行 7 个用空格隔开的非负整数( [0,10] )。输入处理到文件结束为止。

输出

    每组数据对应一组输出,每组数据中按照输入顺序给出每个球员的综合能力和他在该组中的综合排名(从 1 开始),两者用空格隔开,每个球员的输出一行。每组数据最后输出一个空行。

示例输入

 
 
10 8 8 10 5 5 10
13
梅西
佩德罗
比利亚
哈维
伊涅斯塔
蒂亚戈
马斯切拉诺
阿尔维斯
阿比达尔
皮克
普约尔
阿德里亚诺
巴尔德斯
10 9 10 9 10 8 10
8 8 8 8 8 7 9
8 9 8 7 7 6 7
8 8 9 10 9 8 10
8 8 9 9 10 8 10
8 8 8 7 7 7 7
7 7 8 8 6 7 8
8 9 8 8 7 8 8
6 7 8 8 8 8 8
7 8 9 8 8 10 8
8 7 6 8 7 10 8
6 7 8 8 7 8 7
7 10 8 8 8 9 8

9 10 9 8 6 5 8
5
C.罗纳尔多
本泽马
迪马利亚
厄齐尔
阿隆索
9 10 10 8 10 8 8
9 9 9 8 9 8 8
9 8 9 9 9 8 9
9 8 9 9 8 8 8
8 9 8 10 9 8 8

示例输出

 
532 1
453 6
421 9
501 2
496 3
418 11
415 12
451 7
420 10
456 5
429 8
405 13
459 4

499 1
474 3
480 2
466 5
472 4


解题报告
讲讲我的思路,感觉在大点的数就超时的节奏。。。
完全的模拟,构建一个结构数组,结构元素包含输入顺序,排名顺序,名字,各项能力分,综合分。
在输入名字的同时给定结构的输入顺序,在输入各项能力的同时,算出综合分,然后再按综合分给结构排序,注意是给结构排序,排完序又一次循环吧排名顺序给定义,在一次按输入顺序排序,排完就是一组要输出的结构数组。。
这题比较坑的就是排序是的判断条件。。。
见代码。。。
#include<stdio.h>
#include<string.h>
#define swap(k,x,y) ((k)=(x),(x)=(y),(y)=(k))
struct p
{
    char ch[100];
    int rate;
    int sore;
    int nl[7];
    int xb;
};
int main()
{
    //freopen("1.txt","r",stdin);
    int n,i,j;
    int s[10];
    while(scanf("%d",&s[0])!=EOF)
    {
        int num;
        p x[1000];p k;
        memset(x,0,sizeof(x));
        for(i=1;i<7;i++)scanf("%d",&s[i]);
        scanf("%d",&n);
        getchar();
        for(i=0;i<n;i++)
        {
            gets(x[i].ch);
            x[i].xb=i+1;
        }
        for(i=0;i<n;i++)
            for(j=0;j<7;j++)
            {
                scanf("%d",&x[i].nl[j]);

                x[i].sore+=x[i].nl[j]*s[j];
            }
        for(i=0;i<n-1;i++)
            for(j=i+1;j<n;j++)
            {
                if(x[i].sore<x[j].sore)
                swap(k,x[i],x[j]);
                else if(x[i].sore==x[j].sore)
                {
                    if(x[i].nl[0]<x[j].nl[0])swap(k,x[i],x[j]);
                    else if(x[i].nl[0]==x[j].nl[0]&&x[i].nl[1]<x[j].nl[1])swap(k,x[i],x[j]);
                    else if(x[i].nl[0]==x[j].nl[0]&&x[i].nl[1]==x[j].nl[1]&&x[i].nl[2]<x[j].nl[2])swap(k,x[i],x[j]);
                    else if(x[i].nl[0]==x[j].nl[0]&&x[i].nl[1]==x[j].nl[1]&&x[i].nl[2]==x[j].nl[2]&&x[i].nl[3]<x[j].nl[3])swap(k,x[i],x[j]);
                    else if(x[i].nl[0]==x[j].nl[0]&&x[i].nl[1]==x[j].nl[1]&&x[i].nl[2]==x[j].nl[2]&&x[i].nl[3]==x[j].nl[3]&&x[i].nl[4]<x[j].nl[4])swap(k,x[i],x[j]);
                    else if(x[i].nl[0]==x[j].nl[0]&&x[i].nl[1]==x[j].nl[1]&&x[i].nl[2]==x[j].nl[2]&&x[i].nl[3]==x[j].nl[3]&&x[i].nl[4]==x[j].nl[4]&&x[i].nl[5]<x[j].nl[5])swap(k,x[i],x[j]);
                    else if(x[i].nl[0]==x[j].nl[0]&&x[i].nl[1]==x[j].nl[1]&&x[i].nl[2]==x[j].nl[2]&&x[i].nl[3]==x[j].nl[3]&&x[i].nl[4]==x[j].nl[4]&&x[i].nl[5]==x[j].nl[5]&&x[i].nl[6]<x[j].nl[6])swap(k,x[i],x[j]);
                    else if(x[i].nl[0]==x[j].nl[0]&&x[i].nl[1]==x[j].nl[1]&&x[i].nl[2]==x[j].nl[2]&&x[i].nl[3]==x[j].nl[3]&&x[i].nl[4]==x[j].nl[4]&&x[i].nl[5]==x[j].nl[5]&&x[i].nl[6]==x[j].nl[6]&&strcmp(x[i].ch,x[j].ch)>0)swap(k,x[i],x[j]);
                }


            }
        for(i=0;i<n;i++)
            x[i].rate=i+1;
        for(i=0;i<n-1;i++)
            for(j=i+1;j<n;j++)
            {
                if(x[i].xb>x[j].xb)
                swap(k,x[i],x[j]);
            }
        for(i=0;i<n;i++)
        {
            printf("%d %d\n",x[i].sore,x[i].rate);
        }
        printf("\n");

    }

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值