排序向量(冒泡排序)c ++

问题描述 投票:-1回答:1

我有Date类,功能bubbleSort,isAfter和printVector。所以我的任务是:使用bubbleSort函数对矢量类型的对象Date排序(使用isAfter函数比较日期)。我做了一些事情,但是没有用,所以有人可以帮我吗?功能冒泡排序(不适用于“ Date”,不适用于整数,字符串...)。这是我的代码:

//isAfter
template<>
bool isAfter(const Date &first, const Date &second) {
    if (first.getYear() == second.getYear()) {
        if (first.getMonth() == second.getMonth()) {
            if (first.getDay() == second.getDay()) {
                cout << first.toString() << " is equal to " << second.toString() << endl;
                return false;
            } else if (first.getDay() > second.getDay()) {
                cout << " " << first.toString() << " is after " << " " << second.toString() << endl;
                return true;
            } else if (first.getDay() < second.getDay()) {
                cout << " " << second.toString() << " is after " << " " << first.toString() << endl;
                return true;
            }
        } else if (first.getMonth() > second.getMonth()) {
            cout << " " << first.toString() << " is after " << " " << second.toString() << endl;
            return true;
        } else if (first.getMonth() < second.getMonth()) {
            cout << " " << second.toString() << " is after " << " " << first.toString() << endl;
            return true;
        }
    } else if (first.getYear() > second.getYear()) {
        cout << " " << first.toString() << " is after " << " " << second.toString() << endl;
        return true;
    } else if (first.getYear() < second.getYear()) {
        cout << " " << second.toString() << " is after " << " " << first.toString() << endl;
        return true;
    }
    return false;
}

//bubbleSort
template<typename T>
void bubbleSort(vector<T> &vec) {
    bool swapp= true;
    while (swapp) {
        swapp= false;
        for (unsigned int i = 0; i < vec.size()- 1; i++) {
            if (vec[i] > vec[i + 1]) {
                swap(vec[i], vec[i + 1]);
                swapp = true;
            }

        }
    }
}

所以我如何在bubbleSort中添加isAfter以与“ Date”对象一起正常工作?

c++ c++11
1个回答
0
投票

如果这始终是日期的排序顺序,并且您可以控制该类型,则可以为该类型实现比较运算符operator<operator>operator<=operator>=operator==operator!=

否则,传统方法是修改排序算法以接受来自其调用者的自定义比较器(按照惯例,具有operator<的接口,需要您翻转比较),例如:

template <typename T, typename Compare>
void bubbleSort(vector<T> &vec, Compare compare) {
  // as you currently have, but using compare(a, b) instead of a < b
}

template <typename T>
void bubbleSort(vector<T> &vec) {
  bubbleSort(vec, std::less<>());
}

然后,呼叫者可以这样使用isAfter

bubbleSort(dates, [](const Date& a, const Date& b) { return isAfter(b, a); });
© www.soinside.com 2019 - 2024. All rights reserved.