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

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章