43 lines
859 B
C
43 lines
859 B
C
#include "solve.h"
|
|
|
|
void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *))
|
|
{
|
|
int i = 2, j, margin;
|
|
do {
|
|
int hf_i = i/2;
|
|
for (j = 0; j < n; j += i)
|
|
{
|
|
if (n < j+i)
|
|
{
|
|
margin = n-(j+hf_i);
|
|
if (margin <= 0) break;
|
|
} else margin = hf_i;
|
|
|
|
unite(a+j, a+(j+hf_i), b, hf_i, margin, cmp);
|
|
for (int k = 0; k < hf_i+margin; k++) a[j+k] = b[k];
|
|
}
|
|
|
|
i *= 2;
|
|
} while (i < n*2);
|
|
}
|
|
|
|
void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *))
|
|
{
|
|
int i, j, k, cntr, len = n + m; // cntr - contrast
|
|
for (i = 0, j = 0, k = 0; k < len; ++k)
|
|
{
|
|
if (i >= n)
|
|
{
|
|
arr_c[k] = arr_b[j++];
|
|
} else if (j >= m)
|
|
{
|
|
arr_c[k] = arr_a[i++];
|
|
} else
|
|
{
|
|
cntr = cmp(arr_a[i], arr_b[j]);
|
|
if (cntr <= 0) arr_c[k] = arr_a[i++];
|
|
else arr_c[k] = arr_b[j++];
|
|
}
|
|
}
|
|
}
|
|
|