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

properly combining merge sort and insertion sort in c++

本文关键字:合并 排序 插入排序 组合 c++      更新时间:2023-10-16

当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