//(c)Terminator
#include <stdio.h>
// слияние упорядоченных пар в массив
void __merge(int* arr, int* dst, int first, int mid, int last) {
int* off = dst;
int ipos = first;
int pos = mid + 1;
while((first <= mid) && (pos <= last)) {
if(arr[first] <= arr[pos])
*dst++ = arr[first++];
else
*dst++ = arr[pos++];
}
while(first <= mid)
*dst++ = arr[first++];
while(pos <= last)
*dst++ = arr[pos++];
int* ptr = arr + ipos;
while(off != dst)
*ptr++ = *off++;
}
// сортировки слиянием
void merge_sort(int* arr, int* tmp, int first, int last) {
if(first < last) {
int mid = (first + last) / 2;
merge_sort(arr, tmp, first, mid);
merge_sort(arr, tmp, mid + 1, last);
__merge(arr, tmp, first, mid, last);
}
}
int main(void){
const int N = 10;
int arr[N] = { 7, 3, 6, 8, 4, 9, 10, 1, 5, 2 };
int tmp[N];
merge_sort(arr, tmp, 0, N - 1);
for(int i = 0; i < N; ++i)
printf("%d ", arr[i]);
getchar();
return 0;
}
Ly8oYylUZXJtaW5hdG9yCiNpbmNsdWRlIDxzdGRpby5oPgoKCi8vINGB0LvQuNGP0L3QuNC1INGD0L/QvtGA0Y/QtNC+0YfQtdC90L3Ri9GFINC/0LDRgCDQsiDQvNCw0YHRgdC40LIKdm9pZCBfX21lcmdlKGludCogYXJyLCBpbnQqIGRzdCwgaW50IGZpcnN0LCBpbnQgbWlkLCBpbnQgbGFzdCkgewogICAgICAgIGludCogb2ZmID0gZHN0OwogICAgICAgIGludCBpcG9zID0gZmlyc3Q7CiAgICAgICAgaW50IHBvcyAgPSBtaWQgKyAxOwogICAgICAgIHdoaWxlKChmaXJzdCA8PSBtaWQpICYmIChwb3MgPD0gbGFzdCkpIHsKICAgICAgICAgICAgICAgIGlmKGFycltmaXJzdF0gPD0gYXJyW3Bvc10pCiAgICAgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IGFycltmaXJzdCsrXTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gYXJyW3BvcysrXTsKICAgICAgICB9CgogICAgICAgIHdoaWxlKGZpcnN0IDw9IG1pZCkKICAgICAgICAgICAgICAgICpkc3QrKyA9IGFycltmaXJzdCsrXTsKICAgICAgICB3aGlsZShwb3MgPD0gbGFzdCkKICAgICAgICAgICAgICAgICpkc3QrKyA9IGFycltwb3MrK107CgogICAgICAgIGludCogcHRyID0gYXJyICsgaXBvczsKICAgICAgICB3aGlsZShvZmYgIT0gZHN0KQogICAgICAgICAgICAgICAgKnB0cisrID0gKm9mZisrOwp9CgoKLy8g0YHQvtGA0YLQuNGA0L7QstC60Lgg0YHQu9C40Y/QvdC40LXQvAp2b2lkIG1lcmdlX3NvcnQoaW50KiBhcnIsIGludCogdG1wLCBpbnQgZmlyc3QsIGludCBsYXN0KSB7CiAgICAgICAgaWYoZmlyc3QgPCBsYXN0KSB7CiAgICAgICAgICAgICAgICBpbnQgbWlkID0gKGZpcnN0ICsgbGFzdCkgLyAyOwogICAgICAgICAgICAgICAgbWVyZ2Vfc29ydChhcnIsIHRtcCwgZmlyc3QsIG1pZCk7CiAgICAgICAgICAgICAgICBtZXJnZV9zb3J0KGFyciwgdG1wLCBtaWQgKyAxLCBsYXN0KTsKICAgICAgICAgICAgICAgIF9fbWVyZ2UoYXJyLCB0bXAsIGZpcnN0LCBtaWQsIGxhc3QpOwogICAgICAgIH0KfQoKCgppbnQgbWFpbih2b2lkKXsKCWNvbnN0IGludCBOID0gMTA7CglpbnQgYXJyW05dICA9IHsgNywgMywgNiwgOCwgNCwgOSwgMTAsIDEsIDUsIDIgIH07CgoJaW50IHRtcFtOXTsKCW1lcmdlX3NvcnQoYXJyLCB0bXAsIDAsIE4gLSAxKTsKCglmb3IoaW50IGkgPSAwOyBpIDwgTjsgKytpKQoJCXByaW50ZigiJWQgIiwgYXJyW2ldKTsKCWdldGNoYXIoKTsKCXJldHVybiAwOwp9