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

时间:2014-10-21 02:49:02

标签: c++ sorting mergesort insertion-sort threshold

当阈值设置为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;
}

这里的main函数没有足够大的数组来比较性能,但用于测试我的合并排序的代码有点大到这里发布并从文本文件中提取数据我想提供一个示例初始函数调用。

1 个答案:

答案 0 :(得分:1)

错误在于:

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

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