三维排序(将书以Name、Year、Price进行排序

来源:互联网 发布:小米6陶瓷版 知乎 编辑:程序博客网 时间:2024/06/14 14:43

  Jim很喜欢读书,他有很多数,有时候他很难管理它们。因此,他请求你的帮助来解决这个问题。
  Jim想以书名、出版年份和价格为关键字,按照排序标准把书进行排序。一本书由书名Name、出版年份Year和单价Price组成。Name是第一排序标准,Year是第二排序标准,Price是第三排序标准。如果排序标准是Year,且两本书的Year相同,那么,你就应该给它们按Name排序。如果Name还是相同,那么,就应该安Price排序。不存在两本书的三个参数都相同的情况。
  解题思路:本题是三维排序问题。Name、Year和Price分别是默认是第一、第二和第三排序。但本例又很特殊,第一排序是由输入指定的,是Name、Year和Price三者之一。
  当Name是排序标准,那么,三个排序顺序是Name、Year和Price;
  当Year是排序标准时,三个排序顺序是Year、Name和Price;
  当Price是排序标准时,三个排序顺序是Price、Name和Year。
  对于这三种排序标准,我们编写三个比较函数,这样就显得比较灵活,程序实现起来也比较容易。
  而书的信息,则写到一个结果体变量中,而结果体变量又作为向量的元素,最后,只要根据排序标准,在排序算法中选择相应的比较函数,就完成了书的排序了。这里选用“泛型编程”来实现。
  //BookSort.cpp  

#include <fstream>#include <iostream>#include <vector>#include <string>#include <algorithm>using namespace std;//Book的结构体struct Book{    string Name;    int Year;    int Price;};//比较函数,Name主序bool CompName(const Book &b1,const Book &b2){    if(b1.Name != b2.Name)        return b1.Name < b2.Name;    else if(b1.Year != b2.Year)        return b1.Year < b2.Year;    else        return b1.Price < b2.Price;}//比较函数,Year主序bool CompYear(const Book &b1,const Book &b2){    if(b1.Year != b2.Year)        return b1.Year < b2.Year;    else if(b1.Name != b2.Name)        return b1.Name < b2.Name;    else        return b1.Year < b2.Year;}//比较函数,Price主序bool CompPrice(const Book &b1,const Book &b2){    if(b1.Price != b2.Price)        return b1.Price < b2.Price;    else if(b1.Name != b2.Name)        return b1.Name < b2.Name;    else        return b1.Year < b2.Year;}int main(int argc, char* argv[]){    //ifstream cin("aaa.txt");    vector<Book> v;    Book book;    string sorting; //第一排序    int n;    int i;    int line=0;    while(cin>>n){        if(n==0) break;        line++; //案例号        v.clear(); //清空向量        //读入一个案例数据到向量中        for (i=0;i<n;i++)        {            cin>>book.Name>>book.Year>>book.Price;            v.push_back(book);        }        //读入排序标准        cin>>sorting;        //给向量排序,要根据主序来确定比较函数        if(sorting == "Name")            sort(v.begin(),v.end(),CompName);        else if(sorting == "Year")            sort(v.begin(),v.end(),CompYear);        else if(sorting == "Price")            sort(v.begin(),v.end(),CompPrice);        //输出结果        if(line != 1) cout<<endl; //不是第一行,先输出一个空行        for (i=0;i<v.size();i++)        {            cout<<v[i].Name<<" "<<v[i].Year<<" "<<v[i].Price<<endl;        }    }    return 0;}

效果如下:

这里写图片描述

1 0