我需要帮助来理解编程挑战

I need help understanding a programming challenge

本文关键字:编程 挑战 帮助      更新时间:2023-10-16

我正在尝试做一些作业,但无法绕开一个问题。我已经在课堂讨论板上发帖并给教授发了电子邮件,但没有得到任何帮助。

问题是:设计一个类 abstractSort,该类可用于分析排序算法执行的比较次数。该类应该有一个能够比较两个数组元素的成员函数 compare,以及一种跟踪执行的比较次数的方法。该类应该是具有纯虚成员函数的抽象类

virtual void Sort(int arr[], int size)= 0;

当被覆盖时,它将通过调用 compare 函数对数组进行排序,以确定数字对的相对顺序(这是我不明白的短语)。创建 AbstractSort 的子类,该子类使用简单的排序算法来实现排序函数。该类应具有一个成员函数,可以在完成排序后调用该函数以确定执行的比较次数。

我对如何编码有一个想法,但我只是不认为我按照问题的措辞去做。我编写了代码,通过递增计数器并输出该数字来跟踪比较。然而,这个问题困扰着我。作者说"通过调用比较函数来确定数字对的相对顺序"是什么意思

有人知道它们的意思吗? 我只是把一个明显的问题过于复杂化,还是有一些我看不到的微妙挑战。正如我所说,我不需要帮助编码问题,只需要理解问题。

在大多数排序算法的普通实现过程中的某个时刻,你会得到这样的东西:

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()

(该任务的重点是让您意识到继承可以使您不必在每个排序算法实现中复制计数代码。此外,当使用函数指针或函数对象时,"外包"比较的想法也可用于制作一个"可配置"的排序类,在该类的用户可以决定如何执行比较,以便例如降序排序数字,或根据他们的名字对人员列表进行排序, 等)