#include <assert.h> // assert
#include <stddef.h> // size_t
#include <stdlib.h> // qsort, malloc, realloc, free, exit
#include <stdio.h> // printf, scanf
#include <string.h> // memcpy
struct vec{
void *data;
size_t size;
size_t capacity;
size_t elem_size;
};
int vec_init(struct vec *v, size_t elem_size){
v->elem_size = elem_size;
v->size = 0;
v->capacity = 4;
v
->data
= malloc(v
->capacity
* elem_size
); if(v->data == NULL){
v->capacity = 0;
return 0;
}
return 1;
}
void vec_free(struct vec *v){
v->data = NULL;
v->size = 0;
v->capacity = 0;
}
void *vec_get(struct vec *v, size_t i){
return (char *)v->data + i * v->elem_size;
}
int vec_push(struct vec *v, void *elem){
if(v->size >= v->capacity){
size_t new_capacity = v->capacity * 2;
void *new_data
= realloc(v
->data
, new_capacity
* v
->elem_size
); if(new_data == NULL){
return 0;
}
v->data = new_data;
v->capacity = new_capacity;
}
memcpy((char *)v
->data
+ v
->size
* v
->elem_size
, elem
, v
->elem_size
); v->size++;
return 1;
}
void dvq(void *ptr, size_t l, size_t r, size_t elem_size, int (*cmp)(const void *, const void *), struct vec *pom){
if(l >= r) return;
size_t mid = (l + r) / 2;
dvq(ptr, l, mid, elem_size, cmp, pom); dvq(ptr, mid + 1, r, elem_size, cmp, pom);
size_t i = l, j = mid + 1, akt = l;
while(i <= mid && j <= r){
void *ei = (char *)ptr + i * elem_size;
void *ej = (char *)ptr + j * elem_size;
if(cmp(ei, ej) <= 0){
memcpy((char *)pom
->data
+ akt
* elem_size
, ei
, elem_size
); akt++; i++;
}else{
memcpy((char *)pom
->data
+ akt
* elem_size
, ej
, elem_size
); akt++; j++;
}
}
while(i <= mid){
memcpy((char *)pom
->data
+ akt
* elem_size
, (char *)ptr
+ i
* elem_size
, elem_size
); akt++; i++;
}
while(j <= r){
memcpy((char *)pom
->data
+ akt
* elem_size
, (char *)ptr
+ j
* elem_size
, elem_size
); akt++; j++;
}
for(size_t k
= l
; k
<= r
; k
++) memcpy((char *)ptr
+ k
* elem_size
, (char *)pom
->data
+ k
* elem_size
, elem_size
); }
void msort(void *ptr, size_t ile, size_t size, int (*cmp)(const void *, const void *)){
if(ile <= 1) return;
struct vec pom;
if(!vec_init
(&pom
, size
)) exit(1);
while(pom.capacity < ile){
size_t new_cap = pom.capacity * 2;
void *new_data
= realloc(pom.
data, new_cap
* size
); if(new_data == NULL){
vec_free(&pom);
}
pom.data = new_data;
pom.capacity = new_cap;
}
pom.size = ile;
dvq(ptr, 0, ile - 1, size, cmp, &pom);
vec_free(&pom);
}
struct pair{
int first;
int second;
};
int cmp_int(const void *a, const void *b){
int ia = *(const int *)a;
int ib = *(const int *)b;
if(ia < ib) return -1;
if(ia > ib) return 1;
return 0;
}
int cmp_char(const void *a, const void *b){
char ca = *(const char *)a;
char cb = *(const char *)b;
if(ca < cb) return -1;
if(ca > cb) return 1;
return 0;
}
int cmp_pair(const void *a, const void *b){
const struct pair *pa = a;
const struct pair *pb = b;
if(pa->first < pb->first) return -1;
if(pa->first > pb->first) return 1;
return 0;
}
int main(void){
int inty[] = {5, 2, 9, 1, 5, 6};
size_t inty_ile = sizeof(inty) / sizeof(inty[0]);
msort(inty, inty_ile, sizeof(int), cmp_int);
for(size_t i
= 0; i
< inty_ile
; i
++) printf("%d ", inty
[i
]);
char chary[] = {'z', 'a', 'k', 'b', 'm'};
size_t chary_ile = sizeof(chary) / sizeof(chary[0]);
msort(chary, chary_ile, sizeof(char), cmp_char);
for(size_t i
= 0; i
< chary_ile
; i
++) printf("%c ", chary
[i
]);
struct pair pary[] = {{2, 1}, {1, 2}, {2, 2}, {1, 1}};
size_t pary_ile = sizeof(pary) / sizeof(pary[0]);
msort(pary, pary_ile, sizeof(struct pair), cmp_pair);
for(int i
= 0; i
< 4; i
++) printf("(%d,%d), ", pary
[i
].
first, pary
[i
].
second);
return 0;
}
I2luY2x1ZGUgPGFzc2VydC5oPiAgLy8gYXNzZXJ0CiNpbmNsdWRlIDxzdGRkZWYuaD4gIC8vIHNpemVfdAojaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBxc29ydCwgbWFsbG9jLCByZWFsbG9jLCBmcmVlLCBleGl0CiNpbmNsdWRlIDxzdGRpby5oPiAgIC8vIHByaW50Ziwgc2NhbmYKI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gbWVtY3B5CgpzdHJ1Y3QgdmVjewogICAgdm9pZCAqZGF0YTsKICAgIHNpemVfdCBzaXplOwogICAgc2l6ZV90IGNhcGFjaXR5OwogICAgc2l6ZV90IGVsZW1fc2l6ZTsKfTsKCmludCB2ZWNfaW5pdChzdHJ1Y3QgdmVjICp2LCBzaXplX3QgZWxlbV9zaXplKXsKICAgIHYtPmVsZW1fc2l6ZSA9IGVsZW1fc2l6ZTsKICAgIHYtPnNpemUgPSAwOwogICAgdi0+Y2FwYWNpdHkgPSA0OwogICAgdi0+ZGF0YSA9IG1hbGxvYyh2LT5jYXBhY2l0eSAqIGVsZW1fc2l6ZSk7CiAgICBpZih2LT5kYXRhID09IE5VTEwpewogICAgICAgIHYtPmNhcGFjaXR5ID0gMDsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiAxOwp9Cgp2b2lkIHZlY19mcmVlKHN0cnVjdCB2ZWMgKnYpewogICAgZnJlZSh2LT5kYXRhKTsKICAgIHYtPmRhdGEgPSBOVUxMOwogICAgdi0+c2l6ZSA9IDA7CiAgICB2LT5jYXBhY2l0eSA9IDA7Cn0KCnZvaWQgKnZlY19nZXQoc3RydWN0IHZlYyAqdiwgc2l6ZV90IGkpewogICAgYXNzZXJ0KGkgPCB2LT5zaXplKTsKICAgIHJldHVybiAoY2hhciAqKXYtPmRhdGEgKyBpICogdi0+ZWxlbV9zaXplOwp9CgppbnQgdmVjX3B1c2goc3RydWN0IHZlYyAqdiwgdm9pZCAqZWxlbSl7CiAgICBpZih2LT5zaXplID49IHYtPmNhcGFjaXR5KXsKICAgICAgICBzaXplX3QgbmV3X2NhcGFjaXR5ID0gdi0+Y2FwYWNpdHkgKiAyOwogICAgICAgIHZvaWQgKm5ld19kYXRhID0gcmVhbGxvYyh2LT5kYXRhLCBuZXdfY2FwYWNpdHkgKiB2LT5lbGVtX3NpemUpOwogICAgICAgIGlmKG5ld19kYXRhID09IE5VTEwpewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgdi0+ZGF0YSA9IG5ld19kYXRhOwogICAgICAgIHYtPmNhcGFjaXR5ID0gbmV3X2NhcGFjaXR5OwogICAgfQogICAgbWVtY3B5KChjaGFyICopdi0+ZGF0YSArIHYtPnNpemUgKiB2LT5lbGVtX3NpemUsIGVsZW0sIHYtPmVsZW1fc2l6ZSk7CiAgICB2LT5zaXplKys7CiAgICByZXR1cm4gMTsKfQoKdm9pZCBkdnEodm9pZCAqcHRyLCBzaXplX3QgbCwgc2l6ZV90IHIsIHNpemVfdCBlbGVtX3NpemUsIGludCAoKmNtcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopLCBzdHJ1Y3QgdmVjICpwb20pewogICAgaWYobCA+PSByKSByZXR1cm47CgogICAgc2l6ZV90IG1pZCA9IChsICsgcikgLyAyOwogICAgZHZxKHB0ciwgbCwgbWlkLCBlbGVtX3NpemUsIGNtcCwgcG9tKTsgZHZxKHB0ciwgbWlkICsgMSwgciwgZWxlbV9zaXplLCBjbXAsIHBvbSk7CgogICAgc2l6ZV90IGkgPSBsLCBqID0gbWlkICsgMSwgYWt0ID0gbDsKICAgIHdoaWxlKGkgPD0gbWlkICYmIGogPD0gcil7CiAgICAgICAgdm9pZCAqZWkgPSAoY2hhciAqKXB0ciArIGkgKiBlbGVtX3NpemU7CiAgICAgICAgdm9pZCAqZWogPSAoY2hhciAqKXB0ciArIGogKiBlbGVtX3NpemU7CiAgICAgICAgaWYoY21wKGVpLCBlaikgPD0gMCl7CiAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKXBvbS0+ZGF0YSArIGFrdCAqIGVsZW1fc2l6ZSwgZWksIGVsZW1fc2l6ZSk7CiAgICAgICAgICAgIGFrdCsrOyBpKys7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKXBvbS0+ZGF0YSArIGFrdCAqIGVsZW1fc2l6ZSwgZWosIGVsZW1fc2l6ZSk7CiAgICAgICAgICAgIGFrdCsrOyBqKys7CiAgICAgICAgfQogICAgfQogICAgd2hpbGUoaSA8PSBtaWQpewogICAgICAgIG1lbWNweSgoY2hhciAqKXBvbS0+ZGF0YSArIGFrdCAqIGVsZW1fc2l6ZSwgKGNoYXIgKilwdHIgKyBpICogZWxlbV9zaXplLCBlbGVtX3NpemUpOwogICAgICAgIGFrdCsrOyBpKys7CiAgICB9CiAgICB3aGlsZShqIDw9IHIpewogICAgICAgIG1lbWNweSgoY2hhciAqKXBvbS0+ZGF0YSArIGFrdCAqIGVsZW1fc2l6ZSwgKGNoYXIgKilwdHIgKyBqICogZWxlbV9zaXplLCBlbGVtX3NpemUpOwogICAgICAgIGFrdCsrOyBqKys7CiAgICB9CgogICAgZm9yKHNpemVfdCBrID0gbDsgayA8PSByOyBrKyspIG1lbWNweSgoY2hhciAqKXB0ciArIGsgKiBlbGVtX3NpemUsIChjaGFyICopcG9tLT5kYXRhICsgayAqIGVsZW1fc2l6ZSwgZWxlbV9zaXplKTsKfQoKdm9pZCBtc29ydCh2b2lkICpwdHIsIHNpemVfdCBpbGUsIHNpemVfdCBzaXplLCBpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSl7CiAgICBpZihpbGUgPD0gMSkgcmV0dXJuOwoKICAgIHN0cnVjdCB2ZWMgcG9tOwogICAgaWYoIXZlY19pbml0KCZwb20sIHNpemUpKSBleGl0KDEpOwoKICAgIHdoaWxlKHBvbS5jYXBhY2l0eSA8IGlsZSl7CiAgICAgICAgc2l6ZV90IG5ld19jYXAgPSBwb20uY2FwYWNpdHkgKiAyOwogICAgICAgIHZvaWQgKm5ld19kYXRhID0gcmVhbGxvYyhwb20uZGF0YSwgbmV3X2NhcCAqIHNpemUpOwogICAgICAgIGlmKG5ld19kYXRhID09IE5VTEwpewogICAgICAgICAgICB2ZWNfZnJlZSgmcG9tKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgcG9tLmRhdGEgPSBuZXdfZGF0YTsKICAgICAgICBwb20uY2FwYWNpdHkgPSBuZXdfY2FwOwogICAgfQogICAgcG9tLnNpemUgPSBpbGU7CgogICAgZHZxKHB0ciwgMCwgaWxlIC0gMSwgc2l6ZSwgY21wLCAmcG9tKTsKCiAgICB2ZWNfZnJlZSgmcG9tKTsKfQoKc3RydWN0IHBhaXJ7CiAgICBpbnQgZmlyc3Q7CiAgICBpbnQgc2Vjb25kOwp9OwoKaW50IGNtcF9pbnQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYil7CiAgICBpbnQgaWEgPSAqKGNvbnN0IGludCAqKWE7CiAgICBpbnQgaWIgPSAqKGNvbnN0IGludCAqKWI7CiAgICBpZihpYSA8IGliKSByZXR1cm4gLTE7CiAgICBpZihpYSA+IGliKSByZXR1cm4gMTsKICAgIAogICAgCiAgICByZXR1cm4gMDsKfQoKCgoKCmludCBjbXBfY2hhcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKXsKICAgIGNoYXIgY2EgPSAqKGNvbnN0IGNoYXIgKilhOwogICAgY2hhciBjYiA9ICooY29uc3QgY2hhciAqKWI7CiAgICAKICAgIGlmKGNhIDwgY2IpIHJldHVybiAtMTsKICAgIGlmKGNhID4gY2IpIHJldHVybiAxOwogICAgcmV0dXJuIDA7Cn0KCgoKaW50IGNtcF9wYWlyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpewogICAgY29uc3Qgc3RydWN0IHBhaXIgKnBhID0gYTsKICAgIGNvbnN0IHN0cnVjdCBwYWlyICpwYiA9IGI7CiAgICAKICAgIGlmKHBhLT5maXJzdCA8IHBiLT5maXJzdCkgcmV0dXJuIC0xOwogICAgaWYocGEtPmZpcnN0ID4gcGItPmZpcnN0KSByZXR1cm4gMTsKICAgIHJldHVybiAwOwp9CgoKCgppbnQgbWFpbih2b2lkKXsKICAgIGludCBpbnR5W10gPSB7NSwgMiwgOSwgMSwgNSwgNn07CiAgICBzaXplX3QgaW50eV9pbGUgPSBzaXplb2YoaW50eSkgLyBzaXplb2YoaW50eVswXSk7CiAgICBtc29ydChpbnR5LCBpbnR5X2lsZSwgc2l6ZW9mKGludCksIGNtcF9pbnQpOwogICAgcHJpbnRmKCJpbnR5OiAiKTsKICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBpbnR5X2lsZTsgaSsrKSBwcmludGYoIiVkICIsIGludHlbaV0pOwogICAgcHJpbnRmKCJcbiIpOwoKCiAgICBjaGFyIGNoYXJ5W10gPSB7J3onLCAnYScsICdrJywgJ2InLCAnbSd9OwogICAgc2l6ZV90IGNoYXJ5X2lsZSA9IHNpemVvZihjaGFyeSkgLyBzaXplb2YoY2hhcnlbMF0pOwogICAgbXNvcnQoY2hhcnksIGNoYXJ5X2lsZSwgc2l6ZW9mKGNoYXIpLCBjbXBfY2hhcik7CiAgICBwcmludGYoImNoYXJ5OiAiKTsKICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBjaGFyeV9pbGU7IGkrKykgcHJpbnRmKCIlYyAiLCBjaGFyeVtpXSk7CiAgICBwcmludGYoIlxuIik7CgoKCiAgICBzdHJ1Y3QgcGFpciBwYXJ5W10gPSB7ezIsIDF9LCB7MSwgMn0sIHsyLCAyfSwgezEsIDF9fTsKICAgIHNpemVfdCBwYXJ5X2lsZSA9IHNpemVvZihwYXJ5KSAvIHNpemVvZihwYXJ5WzBdKTsKICAgIG1zb3J0KHBhcnksIHBhcnlfaWxlLCBzaXplb2Yoc3RydWN0IHBhaXIpLCBjbXBfcGFpcik7CiAgICBwcmludGYoInBhcnkgKHN0YWJpbG5lKTogIik7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSBwcmludGYoIiglZCwlZCksICIsIHBhcnlbaV0uZmlyc3QsIHBhcnlbaV0uc2Vjb25kKTsKICAgIHByaW50ZigiXG4iKTsKCiAgICByZXR1cm4gMDsKfQ==