題意:
需要將A,B兩個已排序數組合並至A數組中,假設A數組中的空間是夠用的。那麼請寫這麼一個合併函數。
當然,最後的結果也一定是有序的。
解題:
很好寫。直接從後面開始向前合併
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[4096];
int b[4096];
int _cmp(const void *a, const void *b) {
int x = (int)(*(int *)a);
int y = (int)(*(int *)b);
return x - y;
}
void create(int *a, int *b, int *l, int *m) {
int alen = rand() % 1024 + 1;
int blen = rand() % 1024 + 1;
int i = 0;
for (i = 0; i < alen; ++i) {
a[i] = rand() % 4096;
b[i] = rand() % 4096;
}
qsort(a, alen, sizeof(int), _cmp);
qsort(b, blen, sizeof(int), _cmp);
*l = alen; *m = blen;
}
int merge(int *a, const int *b, int alen, int blen) {
int len = alen + blen + 2, dst = alen + blen;
while (alen >= 0 || blen >= 0) {
if (blen < 0 || (alen >= 0 && a[alen-1] >= b[blen-1])) a[--len] = a[--alen];
else a[--len] = b[--blen];
}
return dst;
}
int main(void) {
int alen, blen, len;
int i = 0;
create(a, b, &alen, &blen);
len = merge(a, b, alen, blen);
for (i = 0; i < len; ++i) {
printf("%d ", a[i]);
}
return 0;
}