我正在尝试做一些功课,而不能围绕一个问题。我已经在课堂讨论区发帖并通过电子邮件发送给教授,但我没有得到任何帮助。
问题是: 设计一个类 abstractSort ,可用于分析排序算法执行的比较次数。该类应该具有能够比较两个数组元素的成员函数比较,以及跟踪执行的比较次数的方法。该类应该是具有纯虚拟成员函数的抽象类
virtual void Sort(int arr[], int size)= 0;
,当被覆盖时,将通过调用比较函数对数组进行排序,以确定数字对的相对顺序(这是我不会得到的短语)。创建AbstractSort的子类,它使用简单的排序算法来实现sort函数。该类应该有一个成员函数,可以在完成排序后调用,以确定执行的比较次数。
我知道如何对此进行编码,但我并不认为我会按照问题的措辞来解决问题。我编写了代码,通过递增计数器并输出该数字来跟踪比较。然而,问题是困扰我。通过调用比较函数来确定数字对的相对顺序"
,作者的意思是"有人知道他们的意思吗?我只是过于复杂化了一个明显的问题,还是有一些微妙的挑战,我不明白。 正如我所说,我不需要帮助编码问题,只需要理解问题。
答案 0 :(得分:4)
在大多数排序算法的普通实现过程中的某个时刻,你会有这样的事情:
if (elements[i] < elements[j]) {
// Do something
}
else {
// Do something else
}
将元素比较为单独的函数“外包”通常很方便(为简单起见,我假设被排序的元素是整数):
protected:
bool isSmaller(int a, int b) {
return a < b;
}
// Inside sorting function:
if (isSmaller(elements[i], elements[j])) { ... } else { ... }
结合继承,您可以在基类中定义isSmaller()
,并且对于您想要实现的每个排序算法(快速排序,合并排序,插入排序......),您将创建一个新的子类。但是,每个子类都应该调用isSmaller()
而不是使用<
来确定哪些元素应该在哪个之前。然后,您可以添加“计算比较次数”代码(正如您所说,只包括递增计数器)到isSmaller()
。
(任务的目的是让你意识到继承可以让你不必在每个排序算法实现中复制计数代码。另外,当使用函数指针或函数对象时,“外包”比较的想法也可用于制作“可配置”排序类,其中类的用户可以决定如何执行比较,以便例如对数字进行降序排序,或者根据他们的姓名对人员列表进行排序等。)