I need to implement an algorithm in C++ that, when given three arrays of unequal sizes, produces triplets a,b,c (one element contributed by each array) such that max(a,b,c) - min(a,b,c) is minimized. The algorithm should produce a list of these triplets, in order of size of max(a,b,c)-min(a,b,c). The arrays are sorted.
I've implemented the following algorithm (note that I now use arrays of type double), however it runs excruciatingly slow (even when compiled using GCC with -03 optimization, and other combinations of optimizations). The dataset (and, therefore, each array) has potentially tens of millions of elements. Is there a faster/more efficient method? A significant speed increase is necessary to accomplish the required task in a reasonable time frame.
void findClosest(vector<double> vec1, vector<double> vec2, vector<double> vec3){
 //calculate size of each array
    int len1 = vec1.size();
    int len2 = vec2.size();
    int len3 = vec3.size();
    int i = 0; int j = 0; int k = 0; int res_i, res_j, res_k;
    int diff = INT_MAX;
    int iter = 0; int iter_bound = min(min(len1,len2),len3);
    while(iter < iter_bound)
        while(i < len1 && j < len2 && k < len3){
            int minimum = min(min(vec1[i], vec2[j]), vec3[k]);
            int maximum = max(max(vec1[i], vec2[j]), vec3[k]);
            //if new difference less than previous difference, update difference, store
            //resultants
            if(fabs(maximum - minimum) < diff){ diff = maximum-minimum; res_i = i; res_j = j; res_k = k;}
            //increment minimum value
            if(vec1[i] == minimum) ++i;
            else if(vec2[j] == minimum) ++j;
            else ++k;
    }
    //"remove" triplet
    vec1.erase(vec1.begin() + res_i);
    vec2.erase(vec2.begin() + res_j);
    vec3.erase(vec3.begin() + res_k);
    --len1; --len2; --len3;
    ++iter_bound;
}
 
    