Created
January 11, 2020 14:52
-
-
Save minagi-yu/e218c5103b4d10f2b64a1a71183d8536 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void swap(void *src, void *dst, size_t size) | |
{ | |
char tmp; | |
char *sp = (char *)src; | |
char *dp = (char *)dst; | |
do { | |
tmp = *sp; | |
*sp++ = *dp; | |
*dp++ = tmp; | |
} while (--size); | |
} | |
void reverse(void *base, size_t nmemb, size_t size) | |
{ | |
char *first = (char *)base; | |
char *last = (char *)base + (nmemb - 1) * size; | |
if (nmemb == 0) | |
return; | |
for (; first < last; first += size, last -= size) { | |
swap(first, last, size); | |
} | |
} | |
_Bool next_permutation(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) | |
{ | |
char *first = (char *)base; | |
char *last = (char *)base + (nmemb - 1) * size; | |
char *i = last; | |
for (;;) { | |
i -= size; | |
if (compar(i, i + size) < 0) { | |
char *j = last; | |
while (compar(i, j) >= 0) { | |
j -= size; | |
} | |
swap(i, j, size); | |
reverse(i + size, (last - i) / size, size); | |
return 1; | |
} | |
if (i == first) { | |
reverse(base, nmemb, size); | |
return 0; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment