【发布时间】:2014-10-21 02:49:02
【问题描述】:
当阈值设置为 0 并且它从不使用插入排序时,此实现运行相当快,但是当我将阈值设置为看似任何大小 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;
}
这里的主要函数没有足够大的数组来比较性能,但是用于测试我的合并排序的代码有点大,无法在此处发布并从文本文件中提取数据,我想提供一个示例初始函数调用。
【问题讨论】:
-
制作更小的测试数据集,并使用调试器逐行逐行执行代码,看看会发生什么。
-
您的插入排序看起来有问题。特别是,
j >= 1不应该更像j >= i吗? -
我测试了一种情况,例如有时它不应该调用插入排序的函数,这似乎不是正在发生的事情,它在我期望它的时候调用插入排序
-
我想只是为您的插入排序而踢球和做something like this 已超出此作业的保留范围?
std::upper_bound的二分查找特性特别适合简单的插入排序算法的应用。 -
@ooga 啊这就是问题所在,具体应该是
j>=l(字母不是数字)
标签: c++ sorting mergesort insertion-sort threshold