ソートを選択 - アルゴリズムの注意事項

単純にソートを選択します。

  • 1からnまで列挙私はのために、n個の動作のための時間。[1、I-1]の間隔は[I-1、n]は、順序付けされたランダムな間隔です。
  • 疾患からの最小の要素を見つけるために各時間間隔、iは[1、i]はそう少し加え、順序付け間隔となるように、要素と交換しました。

アルゴリズム:

void seleteSort(){
    for(int i = 0;i<n;i++){
        int k = i;
        for(int j = i;j<n;j++){
            if(a[j]<a[k]){//选出[i,n]中最小的元素,下标为k
                k=j;
            }
        }
        int temp=a[i];
        a[i] = a[k];
        a[k] = temp;
    }
}

挿入ソート:

  • 挿入ソートと同様の選択ソートキーボードは、フロント部分に分類され、後部はソートされていません。
  • 以前にソートされた配列内に挿入さの挿入に応じて前部要素から第2の位置に比べて開始します。

アルゴリズム:

int a[maxn],n;//n为元素个数,数组下标为1-n
void insertSort(){
    for(int i = 2;i<=n;i++){//进行n-1趟排序
        int temp = a[i],j = i;//temp临时存放a[i],j从i开始往前枚举
        while(j>1&&temp<a[j-1]){//只要temp小于前一个元素a[j-1]
            a[j] = a[j-1];//把a[j-1]后移一位至a[j]
            j--;
        }
        a[j] = temp;
    }
}

ソート機能:

  • ソート機能は、ヘッダーの#include <アルゴリズム>を追加し、名前空間stdを使用しなければなりません。
  • ソート()関数は3とり、2が必要とされるがあります。ソート(最初の要素のアドレス、エレメントの終わり次のアドレス)(オプション機能を比較)。
  • 構造体のソート配列(書き込み機能CMP)
//结构体定义
struct node{
    int x,y;
}ssd[10];
//若按照x从小到大来排序
bool cmp(node a,node b){
    return a.x<b.x;
}
//若进行二级排序,即X相等时按照y的大小排序
bool cmp(node a,node b){
    if(a.x!=b.x) return a.x<b.x;
    else return a.y<b.y;
}
  •  STLでは、ベクターのみ、文字列、両端キューは、Aコンテナの使用をマップ、セット、の一種を使用することができるので、ソート順の使用を許可しない、要素自体が整然と、赤黒木の実装です。

PAT 1025 PAT Ranking (25分)

プログラミング能力試験(PAT)は、浙江大学のコンピュータ科学技術大学が主催しています。各テストは、いくつかの場所で同時に実行することになっている、とranklistsは、試験後すぐにマージされます。今ではすべて正しくranklistsをマージし、最終順位を生成するプログラムを書くためにあなたの仕事です。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、正の数N(≤100)、テスト位置の数を含んでいます。次いで、N ranklistsはそれぞれ正の整数K(≤300)、被験者の数を含む行で始まり、登録番号(13桁の番号)と各被験者の総スコアを含む、次いでK線は、従います。行のすべての数字は、スペースで区切られます。

出力仕様:

各テストケースのために、第一列に被験者の総数を印刷します。そして、次の形式で最終ranklistを印刷します:

registration_number final_rank location_number local_rank

 

位置は、出力が最終ランクの順序を非減少でソートしなければならない1からNまで番号が付けられています。同じスコアを持つ被験者は、同じランクを持っている必要があり、出力はその登録番号の順番を非減少でソートする必要があります。

サンプル入力:

2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

 

サンプル出力:

9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

回答:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct stu{
    long long int reg;//¿¼ºÅ
    int score,finrank,loca,locarank;//·ÖÊý,×îÖÕÅÅÃû£¬¿¼³¡£¬¿¼³¡ÅÅÃû
};
bool cmp(stu a,stu b){
    return a.score==b.score?a.reg<b.reg:a.score>b.score;
}

int main(){
    int N;
    cin>>N;
    vector<stu> fin;
    for(int i = 1;i<=N;i++){
        int m;
        cin>>m;
        vector<stu> v(m);
        for(int j = 0;j<m;j++){
            cin>>v[j].reg>>v[j].score;
            v[j].loca = i;
        }
        sort(v.begin(),v.end(),cmp);
        v[0].locarank = 1;
        fin.push_back(v[0]);
        for(int j = 1;j<m;j++){//Õâ¶ù²»ÒªÐ´µ½m
            v[j].locarank = (v[j].score==v[j-1].score)?v[j-1].locarank:(j+1);
            fin.push_back(v[j]);
        }
    }
    sort(fin.begin(),fin.end(),cmp);
    fin[0].finrank = 1;
    for(int j =1;j < fin.size();j++){
        fin[j].finrank = (fin[j].score==fin[j-1].score)?(fin[j-1].finrank):(j+1);
    }
    cout<<fin.size()<<endl;
    for(int i = 0;i<fin.size();i++){
        printf("%013lld %d %d\n",fin[i].reg,fin[i].finrank,fin[i].loca,fin[i].locarank);
    }
    return 0;
}

 

 

 

 

公開された98元の記事 ウォンの賞賛2 ビュー3701

おすすめ

転載: blog.csdn.net/qq_30377869/article/details/105021854