C 144 163
#define f float
f T, *C, m;
f *q(f *A, f *B, int S, f s)
{
if(m)
return abs(T - *A) - abs(T - *B);
for (
C = malloc(S * 4);
m = S--;
C[S] = *B
)
T = A[S],
qsort(B, s, 4, q);
return C;
}
Được rồi ... Tôi nghĩ rằng mã nhỏ này cần giải thích.
Lúc đầu, tôi đã cố gắng thực hiện công việc với hai cấp độ vòng lặp để tìm chênh lệch tối thiểu và đặt giá trị hiện tại thành tối thiểu của giá trị B. Điều đó rất cơ bản.
Điều tương tự có thể đạt được với qsort và chức năng so sánh. Tôi làm cho nó sắp xếp B theo sự khác biệt thay vì các yếu tố của B. Quá nhiều chức năng cho một thuật toán nhỏ như vậy. Vì vậy, chức năng q bây giờ phục vụ hai mục đích. Đầu tiên, nó là thuật toán, thứ hai (khi qsort gọi nó) một bộ so sánh. Để liên lạc giữa hai quốc gia, tôi đã phải tuyên bố toàn cầu.
m là viết tắt của nó cho dù nó ở trạng thái so sánh hay chính .
thí dụ:
float A[] = {1.5, 5.6, 8.9, -33.1};
float B[] = {-20.1, 2.2, 10.3};
float *C;
C = q(A, B, sizeof(A)/sizeof(*A), sizeof(B)/sizeof(*B));
// C holds 2.2,2.2,10.3,-20.1