stable_sort使用 ---NOJ---1073 成绩排名

题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1073

因为题目要求在序号相同时保持原有顺序,而直接使用sort时,会在有相同顺序时破坏原有顺序,所以直接使用stable_sort进行排序。而stable_sort的实现参照归并排序

归并排序是稳定的,而快速排序和堆排序都不稳定

不稳定:就是大小相同的两个数,经过排序后,最终位置与初始位置交换了。

快速排序:
27 23 27 3
以第一个27作为基准,则27与后面那个3交换,形成
3 23 27 27,排序经过一次结束,但最后那个27在排序之初先于初始位置3那个27,所以不稳定。

堆排序:
比如:3 27 36 27,
如果堆顶3先输出,则,第三层的27(最后一个27)跑到堆顶,然后堆稳定,继续输出堆顶,是刚才那个27,这样说明后面的27先于第二个位置的27输出,不稳定。

归并排序(MergeSort)
归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。

#include <iostream>
#include <cstdio>
#include <algorithm> 
#include <cstring>
using namespace std;
char a[105][15];
typedef struct Date
{
    int score;
    int index;
}date;
int cmp(date x,date y)
{
    return x.score>y.score;
}
int main()
{
  int T;
  scanf("%d",&T);
  for(int j=1;j<=T;j++)
  {
          date b[105];
          memset(a,0,sizeof(a));
          memset(b,0,sizeof(b));
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%s%d",a[i],&b[i].score);
            b[i].index=i;
        }
        stable_sort(b,b+n,cmp);
        printf("Case %d:\n",j);
        for(int i=0;i<n;)
        {
            int cnt=1;
            int q=i;
            while(i+cnt<n&&b[i].score==b[i+cnt].score) //注意while的边界判断
                cnt++;
            for(int w=0;w<cnt;w++)
            {
                printf("%d %s %d\n",q+1,a[b[i].index],b[i].score);
                i++;
            }
        }
  }
  return 0;
}

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值