C 合并向量非常快

C 合并向量非常快,c,C,我想非常快地合并数值向量。我在一本书中发现,合并大小为n1和n2的两个向量,需要与n1+n2成比例的时间。那么合并大小为n1,n2,n3的三个向量,顺序重要吗?如果是,为什么 编辑: 是的,向量是按顺序排列的,结果必须按顺序排列。在泛型情况下合并两个排序的数组需要n1和n2中较小的一个,以及与n1+n2-1比较和n1+n2移动的总和 您可以以很少的成本优化特殊情况,例如一个数组中的所有值都低于另一个数组中的所有值的情况。这样做可以显著提高排序和反向排序数组的mergesort性能 如果其中一个数

我想非常快地合并数值向量。我在一本书中发现,合并大小为n1和n2的两个向量,需要与n1+n2成比例的时间。那么合并大小为n1,n2,n3的三个向量,顺序重要吗?如果是,为什么

编辑:
是的,向量是按顺序排列的,结果必须按顺序排列。

在泛型情况下合并两个排序的数组需要
n1
n2
中较小的一个,以及与
n1+n2-1
比较和
n1+n2
移动的总和

您可以以很少的成本优化特殊情况,例如一个数组中的所有值都低于另一个数组中的所有值的情况。这样做可以显著提高排序和反向排序数组的
mergesort
性能

如果其中一个数组明显小于另一个,则较大数组中较小数组的二进制搜索元素将显著减少比较的数量,并允许块将元素从较大数组移动到目标

仔细实现合并代码将避免不必要地测试数组边界

下面是一些代码:

static void merge(int *dest, const int *a1, size_t n1, const int *a2, size_t n2) {
    if (n1 == 0 || n2 == 0 || a1[n1 - 1] <= a2[0]) {
        /* trivial cases and arrays in order */
        memcpy(dest, a1, n1 * sizeof(int));
        memcpy(dest + n1, a2, n2 * sizeof(int));
        return;
    }
    if (a2[n2 - 1] < a1[0]) {
        /* arrays should be swapped */
        memcpy(dest, a2, n2 * sizeof(int));
        memcpy(dest + n2, a1, n1 * sizeof(int));
        return;
    }
    /* general case */
    for (const int *e1 = a1 + n1, *e2 = a2 + n2;;) {
        if (*a1 <= *a2) {
            *dest++ = *a1++;
            if (a1 >= e1) {
                memcpy(dest, a2, (e2 - a2) * sizeof(int));
                break;
            }
        } else {
            *dest++ = *a2++;
            if (a2 >= e2) {
                memcpy(dest, a1, (e1 - a1) * sizeof(int));
                break;
            }
        }
    }
}
静态无效合并(int*dest,const int*a1,大小为n1,const int*a2,大小为n2){
如果(n1==0 | | n2==0 | | a1[n1-1]=e2){
memcpy(dest,a1,(e1-a1)*sizeof(int));
打破
}
}
}
}

你的问题不清楚,你能澄清一下吗?你从来没有提到原始向量或结果合并是否已排序,以及是否要保持排序(不管是什么)。@WhozCraig抱歉,我添加了信息为什么这个问题被标记为
C
?这实际上是一个一般的计算机科学问题(复杂性-大O)。。。