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

57 篇文章 1 订阅

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

效果如下:

这里写图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanqima

一键三连,多多益善

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值