Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中正确组合合并排序和插入排序+;_C++_Sorting_Mergesort_Insertion Sort_Threshold - Fatal编程技术网

C++ 在c+中正确组合合并排序和插入排序+;

C++ 在c+中正确组合合并排序和插入排序+;,c++,sorting,mergesort,insertion-sort,threshold,C++,Sorting,Mergesort,Insertion Sort,Threshold,当threshold设置为0时,这个实现运行得相当快,它从不使用插入排序,但是当我将threshold设置为任何大小2或更大时,它的运行速度与插入排序相同。排序函数都是正确排序的,所以我怀疑C++中实现错误的原因是它显著地减慢。p> void insertion_sort(double* array, int l, int r) { for (int i = l; i <= r; i++) { double tmp = array[i]; i

当threshold设置为0时,这个实现运行得相当快,它从不使用插入排序,但是当我将threshold设置为任何大小2或更大时,它的运行速度与插入排序相同。排序函数都是正确排序的,所以我怀疑C++中实现错误的原因是它显著地减慢。p>
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;
}
void插入\u排序(双*数组,int l,int r)
{
对于(inti=l;i=1)和&(数组[j-1]>tmp))
{
数组[j]=数组[j-1];
j--;
}
数组[j]=tmp;
}
}
无效合并(双*arr、双*temp、整数l、整数m、整数r)
{
int i=l;
int j=m+1;
int k=l;
而((i错误在这里:

while ((j >= 1) && (array[j - 1] > tmp))

而不是
J>=1
它应该是
J>l
(字母
l
).

创建更小的测试数据集,并使用调试器逐行检查代码以查看发生了什么。您的插入排序看起来是错误的。特别是,
j>=1
不应该更像
j>=i
?我测试了一种情况,例如函数在不应该调用插入排序的时候调用插入排序这似乎不是正在发生的事情,它在我期待它的时候调用了插入排序。我想,只是划船和做你的插入排序是这个任务的保留吗?
std::upper_bound
的二进制搜索功能对于简单插入排序算法的应用特别好。@ooga-ah-that问题所在,具体地说,它实际上应该是
j>=l
(字母而不是数字)