按相反顺序排序。 "Don't repeat yourself"规则
Sort in reverse order. "Don't repeat yourself" rule
下面是一段执行插入排序的c++代码:
#ifndef INSERTIONSORT
#define INSERTIONSORT
template<class T>
void insertionSort(T* elements, int size, int reverse = 0) {
T tempElement;
int j;
for (int i = 0; i < size; ++i) {
tempElement = elements[i];
for (j = i - 1; j >= 0 && elements[j] > tempElement; j--)
elements[j + 1] = elements[j];
elements[j + 1] = tempElement;
}
}
#endif
如果不重复代码我就写不出来。这不是我第一次遇到这种问题了。我只需要把<
替换成>
,当reverse
= 1时。我尝试的第一种方法是使用三元操作符:
(repeat)?(elements[j] > tempElement):(elements[j] < tempElement)
它看起来有点奇怪,我知道这不是解决问题的最好方法,所以我试着这样做:
elements[j] (reverse)?(<):(>) tempElement
但这是不正确的,不起作用。另外,三元运算符将if语句中的基本运算次数增加了一倍。我知道它只是一个插入排序,做Θ(n^2)次操作(不是对很多元素排序的最好方法),但我认为有更好的方法来写它。另外,你不能使用this:
(repeat)?(-1):(1) * (elements[j] - tempElement) > 0
因为类T只能有operator=和operator> (operator<)。你也不能在循环中调用函数,因为它将是Θ(n)或Θ(n^2)调用。下面是最后一个解决方案:
#ifndef INSERTIONSORT
#define INSERTIONSORT
template<class T>
void insertionSort(T* elements, int size, int reverse = 0) {
T tempElement;
int j;
if (reverse)
for (int i = 0; i < size; ++i) {
tempElement = elements[i];
for (j = i - 1; j >= 0 && elements[j] < tempElement; j--)
elements[j + 1] = elements[j];
elements[j + 1] = tempElement;
}
else
for (int i = 0; i < size; ++i) {
tempElement = elements[i];
for (j = i - 1; j >= 0 && elements[j] > tempElement; j--)
elements[j + 1] = elements[j];
elements[j + 1] = tempElement;
}
}
#endif
唯一的问题是重复代码。编程的主要原则是:"不要重复自己"。我真的不知道如何在这里正确地编写代码。
您可以添加比较器作为类型,如下面的示例所示:
template<template<class> class COMP = std::less, typename T>
void insertionSort(T* elements, int size) {
T tempElement;
int j;
COMP<T> pred;
for (int i = 0; i < size; ++i) {
tempElement = elements[i];
for (j = i - 1; j >= 0 && pred(tempElement, elements[j]); --j)
elements[j + 1] = elements[j];
elements[j + 1] = tempElement;
}
}
现场演示
相关文章:
- 此代码是否违反一个定义规则
- 生成文件不对文件使用隐式规则
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 静态结构和一个定义规则
- 尽管遵循了规则,内存泄漏在哪里
- 这是关于成员访问规则的正确摘要吗
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 增强精神解析器规则以检测语句中的特殊结尾
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 为什么此指针值不能转换为整数的规则是什么?
- 传递通用函数,用于梯形规则的数值积分
- C++内存模型中的确切规则阻止在获取操作之前重新排序
- 模板如何影响C++中隐式声明的规则?
- antlr 规则上下文是否可以独立于目标
- Bison/flex 在识别规则后等待输入
- 生成文件中隐式规则中的 -c 标志出错
- 单链接列表实现,规则为 3
- 指针算术规则中的"possibly-hypothetical"是什么意思?
- 假设声明中某些上下文中需要的名称查找规则是什么
- 按相反顺序排序。 "Don't repeat yourself"规则