int* semiMerge(int*, int, int*, int);
int main() {
const int A1[] = {1, 3, 6, 0};
const int A2[] = {2, 5, 7, 13, 10, 22, 11};
const int L1 = sizeof(A1)/sizeof(int);
const int L2 = sizeof(A2)/sizeof(int) - L1;
int* out = semiMerge(A1, L1, A2, L2);
}
int* semiMerge(A1, L1, A2, L2) {
int* output = new int[L2 + L2 + L1];
//merge does a sorted combination of the items--both sets must be sorted up to the endpoints;
//we want to merge only the first L1 results from each array
std::merge(A1, A1 + L2,
A2, A2 + L2,
output);
//at this point, we have an array of 2*L1 elements, all sorted properly.
//we want to start looking at the first element we didn't copy from A2,
//the -1 is to account for the fact that begin() + L1 is the start of the L1+1th slot
std::copy(A2 + L2,
A2 + L2 + L1,
(output + L2 + L2 - 1));
return output;
}
Я решил показать A1 и A1 как статические массивы, но если вы получаете их как int*
s для массивов, выделенных в куче, и если важно, чтобы готовый массив был помещен в L2, вы можете сказать delete[] L2; L2 = out;
после звонка на semiMerge()
. Я решил не делать этого в основном, потому что я представлял A2
как статический массив, в то время как переключение его на содержимое out
потребовало бы, чтобы он был указателем на динамический массив.