1. 程式人生 > >1028. List Sorting (25)

1028. List Sorting (25)

AD 第一個 排序 opera tdi clas 重點 思路 編寫

距離PAT考試還有18天最重要的是做透每一題

這一題比較簡單

不過也有學到的東西

一個是sort的第三個參數 可以是 一個函數指針也可以是一個函數對象 代碼來自網絡

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass { bool operator() (int i,int j) { return (i<j);} } myobject; int main () { int myints[] = {32,71,12,45,26,80,53,33}; std::vector<int> myvector (myints, myints+8); // 32 71 12 45 26 80 53 33 // using default comparison (operator <): std::sort (myvector.begin(), myvector.begin()+4
); //(12 32 45 71)26 80 53 33 // using function as comp std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80) // using object as comp std::sort (myvector.begin(), myvector.end(), myobject); //(12 26 32 33 45 53 71 80) // print out content: std::cout << "
myvector contains:"; for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it) std::cout << << *it; std::cout << \n; return 0; }

另一個是strcmp函數 比較兩個c字符串的函數當兩個字符串相等時就返回0第一個較小時(比較ASCII)返回值小於0

思路:

用結構體存儲得到的元素

並用sort函數排序重點是cmp函數的編寫

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int n,c;
struct Re{
  int id;
  char name[10];
  int grade;
  
  Re(){
    id =0;
    for(int i=0;i<10;i++) name[i]=\0;
    grade=0;
  }
};
vector<Re> rv;

bool cmp1(Re r1,Re r2) {
  return r1.id<r2.id;
}
bool cmp2(Re r1,Re r2) {
  if(strcmp(r1.name,r2.name) < 0){
    return true;
  } else if(strcmp(r1.name,r2.name) == 0) {
    return r1.id < r2.id;
  }
  return false;
}
bool cmp3(Re r1,Re r2) {
  if(r1.grade == r2.grade) {
    return r1.id < r2.id;
  }
  return r1.grade<r2.grade;
}

int main() {
  scanf("%d %d",&n,&c);
  
  for(int i =0;i<n;i++) {
    Re re;
    scanf("%d",&(re.id));
    scanf("%s",&(re.name[0]));
    scanf("%d",&(re.grade));
    
    rv.push_back(re);
  }
  
  switch (c) {
  case 1:
    sort(rv.begin(),rv.end(),cmp1);
    break;
  case 2:
    sort(rv.begin(),rv.end(),cmp2);
    break;
  case 3:
    sort(rv.begin(),rv.end(),cmp3);
    break;
  }
  for(int i=0;i<rv.size();i++){
    printf("%06d %s %d\n",rv[i].id,rv[i].name,rv[i].grade);
  }
  return 0;
}

技術分享圖片

1028. List Sorting (25)