在c++中正确组合合并排序和插入排序
properly combining merge sort and insertion sort in c++
当threshold设置为0时,这个实现工作得相当快,而且它从不使用插入排序,但当我将threshold设为任何大小2或更大时,它的运行速度与插入排序的速度相同。两个排序函数都进行了正确的排序,所以我怀疑c++中的实现有问题,导致它的速度显著减慢。
void insertion_sort(double* array, int l, int r)
{
for (int i = l; i <= r; i++)
{
double tmp = array[i];
int j = i;
while ((j >= 1) && (array[j - 1] > tmp))
{
array[j] = array[j - 1];
j--;
}
array[j] = tmp;
}
}
void merge(double* arr, double* temp, int l, int m, int r)
{
int i = l;
int j = m + 1;
int k = l;
while ((i <= m) && (j <= r))
{
if (arr[i] < arr[j])
{
temp[k] = arr[i];
i++;
}
else
{
temp[k] = arr[j];
j++;
}
k++;
}
for (; j <= r; j++, k++)
temp[k] = arr[j];
for (; i <= m; i++, k++)
temp[k] = arr[i];
for (i = l; i <= r; i++)
arr[i] = temp[i];
}
void mergesort(double* arr, double* temp, int l, int r, int threshold)
{
if (l < r)
{
if ((r - l) <= threshold)
insertion_sort(arr, l, r);
else
{
int m = (l + r) / 2;
mergesort(arr, temp, l, m, threshold);
mergesort(arr, temp, m + 1, r, threshold);
merge(arr, temp, l, m, r);
}
}
}
int main()
{
double array[100];
for(int i = 0;i<100;i++)
array[i] = rand() % 100 +1;
double * temp = new double[100];
mergesort(array,temp, 0, 99,10);
delete[] temp;
return 0;
}
这里的主函数没有足够大的数组来比较性能,但用于测试合并排序的代码有点太大,无法发布在这里,并从文本文件中提取数据,我想提供一个初始函数调用的示例。
错误就在这里:
while ((j >= 1) && (array[j - 1] > tmp))
它应该是j > l
(字母l
)而不是J >= 1
。
相关文章:
- 使用C++程序合并排序没有得到正确的输出
- 用于合并排序的合并函数
- 合并排序不排序自创建数组类 c++
- 仅在大型阵列上出现合并排序分段错误
- C++合并排序可视化工具
- 没有输出的合并排序我做错了什么?
- 字符串上的合并排序上的 Seg 错误
- 使用向量在 c++ 中合并排序实现
- 我无法让我的合并排序实现运行
- 合并排序:分段错误核心转储
- 合并排序中的错误计数:计数反转
- C++ 多线程 - 与线程合并排序的算法替代
- C++中合并排序算法的奇怪行为
- 合并排序没有给我任何输出
- C++ 中的合并排序
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- 在实现合并排序代码时无法计算所有反转
- 在C++中使用迭代器合并排序
- 运行合并排序递归算法时EXC_BAD_ACCESS错误
- 我的C++合并排序代码不起作用。我在这里错过了什么?