寻找c++快速排序/插入排序组合中的错误
Looking for error in C++ Quicksort / Insertion sort combo
我试图建立一个快速排序/插入排序组合,因为有人说它相当快,因为它处理较大的子数组与快速排序和较小的数组与插入排序,但有些东西肯定是不正确的。我一直在用我生成的一些文件测试排序。我目前正在使用一个包含1,000,000个数字的文件,每个数字的范围限制为1到1,000,000。在添加插入排序之前,我能够在大约0.2秒内对100万个数字进行排序,在将插入排序作为条件if语句添加之后,我很幸运地在不到4秒内对100,000个数字进行了排序,因此我知道代码中存在错误,但我找不到它。我的代码只是这些类型的排序方法的不同在线参考的混合体,我不声称这些代码是我自己的,如果需要,可以提供原始代码的链接。但是,我使用的引用不是用c++编写的,而且是面向类的,所以我必须进行更改,这就是为什么我认为有错误。
void modifiedQuickSort(arrPtr &arrayPointer, int first, int last)
{
int firstTemp = first, lastTemp = last;
int temp;
int pivot = arrayPointer[(first + last) / 2];
if((last - first) < 10)
{
insertionSort(arrayPointer, last + 1);
}
else
{
// Partitioning Step
while (firstTemp <= lastTemp)
{
while (arrayPointer[firstTemp] < pivot)
firstTemp++;
while (arrayPointer[lastTemp] > pivot)
lastTemp--;
if (firstTemp <= lastTemp)
{
temp = arrayPointer[firstTemp];
arrayPointer[firstTemp] = arrayPointer[lastTemp];
arrayPointer[lastTemp] = temp;
firstTemp++;
lastTemp--;
}
}
// Recursive step
if (first < lastTemp)
modifiedQuickSort(arrayPointer, first, lastTemp);
if (firstTemp < last)
modifiedQuickSort(arrayPointer, firstTemp, last);
}
}
void insertionSort(arrPtr &arrayPointer, const int &arraySize)
{
int i, key, j;
for (i = 1; i < arraySize; i++)
{
key = arrayPointer[i];
j = i-1;
/* Move elements of arr[0..i-1], that are
greater than key, to one position ahead
of their current position */
while (j >= 0 && arrayPointer[j] > key)
{
arrayPointer[j+1] = arrayPointer[j];
j = j-1;
}
arrayPointer[j+1] = key;
}
}
如果您检查插入排序的执行情况,您会发现它可以对远大于10的数组进行排序。如果你听从利珀特的书面建议,用π ντα ρ ε ε联系起来,你就会发现这一点。
如果你仍然有一个bug,那么首先仔细检查你的规范是否包含每个方法的所有前置条件和后置条件。
和
如果你仍然有一个bug,那么学习如何编写断言来验证你的前置条件和后置条件。
函数调用
if((last - first) < 10)
{
insertionSort(arrayPointer, last + 1);
}
表示insertionSort
操作的是整个阵列的[0, last]
,而不是[first, last]
。
更改此值,您的modifiedQuicksort
的性能将按照预期运行。
相关文章:
- 警告处理为错误这里有什么问题
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- Freeopcua C++ 客户端和 Python Opcua 的组合会在 getChild() 上抛出错误
- 使用to_string、reverse、stoi组合的C++反转编号给出运行时错误实例超出范围
- 组合 lambda 捕获时出现编译错误
- OpenCV 错误的解决方案:不支持的格式或格式组合 - 当将 ORB 功能与 FlannBasedMatcher 匹配
- 类组合中的构造函数错误
- 将PCH,PDB和Zi组合在一起会导致VS2017的C2859编译错误令人费解
- C Fstream字符串组合错误
- 覆盖组合对象的<<运算符会给出错误 C++
- OpenCV错误:不支持的格式或格式组合(Point3f类型的点的矢量的矢量)
- 组合框初始化错误:无法读取未定义的属性'constructor'
- 将glUniformMatrix与数组组合使用时出现分割错误
- 试图将字符串的两个元素组合在一起会得到错误的结果(c++)
- 使用C++进行 OpenCv 相机校准(不支持的格式或格式组合错误)
- 寻找c++快速排序/插入排序组合中的错误
- 错误:类计算机组合已在 computer.obj 中定义
- QString和stdstring组合在std::编译错误中不起作用
- C++如何处理对象组合中出现的错误
- 怎么了?-组合编译错误(与家庭+人类的例子)