#include <stdio.h>
#include <inttypes.h>
#include <string.h>
void uintprint5(uint32_t *a)
{
printf("%u %u %u %u %u\n", a
[0], a
[1], a
[2], a
[3], a
[4]); }
void sort2(uint32_t *a, uint32_t *b)
{
uint32_t tmp[3] = {*a, *b, *a};
uint8_t bits = (*a > *b);
*a = tmp[0 + bits];
*b = tmp[1 + bits];
}
void sort3(uint32_t a[static 3])
{
uint16_t mask = 0x6124;
uint8_t bits = (a[0] <= a[1]) | ((a[1] <= a[2]) << 1) | ((a[0] <= a[2]) << 2);
static const uint8_t b[] =
{
[0b000] = 3, // =0
[0b001] = 8,
[0b010] = 10,
[0b101] = 2, // =5
[0b110] = 1, // =4
[0b111] = 12,
};
mask >>= b[bits];
uint32_t tmp[3] = {a[(mask>>4)&0b11], a[(mask>>2)&0b11], a[(mask)&0b11]};
memcpy(a
, tmp
, 3*sizeof(uint32_t)); }
void sort5(uint32_t a[static 5])
{
sort3(a + 0); sort2(a + 3, a + 4);
sort2(a + 0, a + 4); sort2(a + 1, a + 3);
sort2(a + 0, a + 1); sort3(a + 2);
}
int main(void)
{
uint32_t a[][5] = {
{0, 1, 2, 3, 4},
{0, 1, 2, 4, 3},
{0, 1, 3, 2, 4},
{0, 1, 3, 4, 2},
{0, 1, 4, 2, 3},
{0, 1, 4, 3, 2},
{0, 2, 1, 3, 4},
{0, 2, 1, 4, 3},
{0, 2, 3, 1, 4},
{0, 2, 3, 4, 1},
{0, 2, 4, 1, 3},
{0, 2, 4, 3, 1},
{0, 3, 1, 2, 4},
{0, 3, 1, 4, 2},
{0, 3, 2, 1, 4},
{0, 3, 2, 4, 1},
{0, 3, 4, 1, 2},
{0, 3, 4, 2, 1},
{0, 4, 1, 2, 3},
{0, 4, 1, 3, 2},
{0, 4, 2, 1, 3},
{0, 4, 2, 3, 1},
{0, 4, 3, 1, 2},
{0, 4, 3, 2, 1},
{1, 0, 2, 3, 4},
{1, 0, 2, 4, 3},
{1, 0, 3, 2, 4},
{1, 0, 3, 4, 2},
{1, 0, 4, 2, 3},
{1, 0, 4, 3, 2},
{1, 2, 0, 3, 4},
{1, 2, 0, 4, 3},
{1, 2, 3, 0, 4},
{1, 2, 3, 4, 0},
{1, 2, 4, 0, 3},
{1, 2, 4, 3, 0},
{1, 3, 0, 2, 4},
{1, 3, 0, 4, 2},
{1, 3, 2, 0, 4},
{1, 3, 2, 4, 0},
{1, 3, 4, 0, 2},
{1, 3, 4, 2, 0},
{1, 4, 0, 2, 3},
{1, 4, 0, 3, 2},
{1, 4, 2, 0, 3},
{1, 4, 2, 3, 0},
{1, 4, 3, 0, 2},
{1, 4, 3, 2, 0},
{2, 0, 1, 3, 4},
{2, 0, 1, 4, 3},
{2, 0, 3, 1, 4},
{2, 0, 3, 4, 1},
{2, 0, 4, 1, 3},
{2, 0, 4, 3, 1},
{2, 1, 0, 3, 4},
{2, 1, 0, 4, 3},
{2, 1, 3, 0, 4},
{2, 1, 3, 4, 0},
{2, 1, 4, 0, 3},
{2, 1, 4, 3, 0},
{2, 3, 0, 1, 4},
{2, 3, 0, 4, 1},
{2, 3, 1, 0, 4},
{2, 3, 1, 4, 0},
{2, 3, 4, 0, 1},
{2, 3, 4, 1, 0},
{2, 4, 0, 1, 3},
{2, 4, 0, 3, 1},
{2, 4, 1, 0, 3},
{2, 4, 1, 3, 0},
{2, 4, 3, 0, 1},
{2, 4, 3, 1, 0},
{3, 0, 1, 2, 4},
{3, 0, 1, 4, 2},
{3, 0, 2, 1, 4},
{3, 0, 2, 4, 1},
{3, 0, 4, 1, 2},
{3, 0, 4, 2, 1},
{3, 1, 0, 2, 4},
{3, 1, 0, 4, 2},
{3, 1, 2, 0, 4},
{3, 1, 2, 4, 0},
{3, 1, 4, 0, 2},
{3, 1, 4, 2, 0},
{3, 2, 0, 1, 4},
{3, 2, 0, 4, 1},
{3, 2, 1, 0, 4},
{3, 2, 1, 4, 0},
{3, 2, 4, 0, 1},
{3, 2, 4, 1, 0},
{3, 4, 0, 1, 2},
{3, 4, 0, 2, 1},
{3, 4, 1, 0, 2},
{3, 4, 1, 2, 0},
{3, 4, 2, 0, 1},
{3, 4, 2, 1, 0},
{4, 0, 1, 2, 3},
{4, 0, 1, 3, 2},
{4, 0, 2, 1, 3},
{4, 0, 2, 3, 1},
{4, 0, 3, 1, 2},
{4, 0, 3, 2, 1},
{4, 1, 0, 2, 3},
{4, 1, 0, 3, 2},
{4, 1, 2, 0, 3},
{4, 1, 2, 3, 0},
{4, 1, 3, 0, 2},
{4, 1, 3, 2, 0},
{4, 2, 0, 1, 3},
{4, 2, 0, 3, 1},
{4, 2, 1, 0, 3},
{4, 2, 1, 3, 0},
{4, 2, 3, 0, 1},
{4, 2, 3, 1, 0},
{4, 3, 0, 1, 2},
{4, 3, 0, 2, 1},
{4, 3, 1, 0, 2},
{4, 3, 1, 2, 0},
{4, 3, 2, 0, 1},
{4, 3, 2, 1, 0},
};
for(int i = 0; i < 120; ++i) {
sort5(a[i]);
uintprint5(a[i]);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpbnR0eXBlcy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+Cgp2b2lkIHVpbnRwcmludDUodWludDMyX3QgKmEpCnsKICBwcmludGYoIiV1ICV1ICV1ICV1ICV1XG4iLCBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdKTsKfQoKCnZvaWQgc29ydDIodWludDMyX3QgKmEsIHVpbnQzMl90ICpiKQp7CiAgdWludDMyX3QgdG1wWzNdID0geyphLCAqYiwgKmF9OwogIHVpbnQ4X3QgYml0cyA9ICgqYSA+ICpiKTsKICAqYSA9IHRtcFswICsgYml0c107CiAgKmIgPSB0bXBbMSArIGJpdHNdOwp9Cgp2b2lkIHNvcnQzKHVpbnQzMl90IGFbc3RhdGljIDNdKQp7CiAgdWludDE2X3QgbWFzayA9IDB4NjEyNDsKICB1aW50OF90IGJpdHMgPSAoYVswXSA8PSBhWzFdKSB8ICgoYVsxXSA8PSBhWzJdKSA8PCAxKSB8ICgoYVswXSA8PSBhWzJdKSA8PCAyKTsKICBzdGF0aWMgY29uc3QgdWludDhfdCBiW10gPQogIHsKICAgIFswYjAwMF0gPSAgMywgLy8gPTAKICAgIFswYjAwMV0gPSAgOCwKICAgIFswYjAxMF0gPSAxMCwKICAgIFswYjEwMV0gPSAgMiwgLy8gPTUKICAgIFswYjExMF0gPSAgMSwgLy8gPTQKICAgIFswYjExMV0gPSAxMiwKICB9OwogIG1hc2sgPj49IGJbYml0c107CiAgdWludDMyX3QgdG1wWzNdID0ge2FbKG1hc2s+PjQpJjBiMTFdLCBhWyhtYXNrPj4yKSYwYjExXSwgYVsobWFzaykmMGIxMV19OwogIG1lbWNweShhLCB0bXAsIDMqc2l6ZW9mKHVpbnQzMl90KSk7Cn0KCnZvaWQgc29ydDUodWludDMyX3QgYVtzdGF0aWMgNV0pCnsKICBzb3J0MyhhICsgMCk7ICAgICAgICBzb3J0MihhICsgMywgYSArIDQpOwogIHNvcnQyKGEgKyAwLCBhICsgNCk7IHNvcnQyKGEgKyAxLCBhICsgMyk7CiAgc29ydDIoYSArIDAsIGEgKyAxKTsgc29ydDMoYSArIDIpOwp9CiAKaW50IG1haW4odm9pZCkKewogIHVpbnQzMl90IGFbXVs1XSA9IHsKICAgIHswLCAxLCAyLCAzLCA0fSwgCiAgICB7MCwgMSwgMiwgNCwgM30sIAogICAgezAsIDEsIDMsIDIsIDR9LCAKICAgIHswLCAxLCAzLCA0LCAyfSwgCiAgICB7MCwgMSwgNCwgMiwgM30sIAogICAgezAsIDEsIDQsIDMsIDJ9LCAKICAgIHswLCAyLCAxLCAzLCA0fSwgCiAgICB7MCwgMiwgMSwgNCwgM30sIAogICAgezAsIDIsIDMsIDEsIDR9LCAKICAgIHswLCAyLCAzLCA0LCAxfSwgCiAgICB7MCwgMiwgNCwgMSwgM30sIAogICAgezAsIDIsIDQsIDMsIDF9LCAKICAgIHswLCAzLCAxLCAyLCA0fSwgCiAgICB7MCwgMywgMSwgNCwgMn0sIAogICAgezAsIDMsIDIsIDEsIDR9LCAKICAgIHswLCAzLCAyLCA0LCAxfSwgCiAgICB7MCwgMywgNCwgMSwgMn0sIAogICAgezAsIDMsIDQsIDIsIDF9LCAKICAgIHswLCA0LCAxLCAyLCAzfSwgCiAgICB7MCwgNCwgMSwgMywgMn0sIAogICAgezAsIDQsIDIsIDEsIDN9LCAKICAgIHswLCA0LCAyLCAzLCAxfSwgCiAgICB7MCwgNCwgMywgMSwgMn0sIAogICAgezAsIDQsIDMsIDIsIDF9LCAKICAgIHsxLCAwLCAyLCAzLCA0fSwgCiAgICB7MSwgMCwgMiwgNCwgM30sIAogICAgezEsIDAsIDMsIDIsIDR9LCAKICAgIHsxLCAwLCAzLCA0LCAyfSwgCiAgICB7MSwgMCwgNCwgMiwgM30sIAogICAgezEsIDAsIDQsIDMsIDJ9LCAKICAgIHsxLCAyLCAwLCAzLCA0fSwgCiAgICB7MSwgMiwgMCwgNCwgM30sIAogICAgezEsIDIsIDMsIDAsIDR9LCAKICAgIHsxLCAyLCAzLCA0LCAwfSwgCiAgICB7MSwgMiwgNCwgMCwgM30sIAogICAgezEsIDIsIDQsIDMsIDB9LCAKICAgIHsxLCAzLCAwLCAyLCA0fSwgCiAgICB7MSwgMywgMCwgNCwgMn0sIAogICAgezEsIDMsIDIsIDAsIDR9LCAKICAgIHsxLCAzLCAyLCA0LCAwfSwgCiAgICB7MSwgMywgNCwgMCwgMn0sIAogICAgezEsIDMsIDQsIDIsIDB9LCAKICAgIHsxLCA0LCAwLCAyLCAzfSwgCiAgICB7MSwgNCwgMCwgMywgMn0sIAogICAgezEsIDQsIDIsIDAsIDN9LCAKICAgIHsxLCA0LCAyLCAzLCAwfSwgCiAgICB7MSwgNCwgMywgMCwgMn0sIAogICAgezEsIDQsIDMsIDIsIDB9LCAKICAgIHsyLCAwLCAxLCAzLCA0fSwgCiAgICB7MiwgMCwgMSwgNCwgM30sIAogICAgezIsIDAsIDMsIDEsIDR9LCAKICAgIHsyLCAwLCAzLCA0LCAxfSwgCiAgICB7MiwgMCwgNCwgMSwgM30sIAogICAgezIsIDAsIDQsIDMsIDF9LCAKICAgIHsyLCAxLCAwLCAzLCA0fSwgCiAgICB7MiwgMSwgMCwgNCwgM30sIAogICAgezIsIDEsIDMsIDAsIDR9LCAKICAgIHsyLCAxLCAzLCA0LCAwfSwgCiAgICB7MiwgMSwgNCwgMCwgM30sIAogICAgezIsIDEsIDQsIDMsIDB9LCAKICAgIHsyLCAzLCAwLCAxLCA0fSwgCiAgICB7MiwgMywgMCwgNCwgMX0sIAogICAgezIsIDMsIDEsIDAsIDR9LCAKICAgIHsyLCAzLCAxLCA0LCAwfSwgCiAgICB7MiwgMywgNCwgMCwgMX0sIAogICAgezIsIDMsIDQsIDEsIDB9LCAKICAgIHsyLCA0LCAwLCAxLCAzfSwgCiAgICB7MiwgNCwgMCwgMywgMX0sIAogICAgezIsIDQsIDEsIDAsIDN9LCAKICAgIHsyLCA0LCAxLCAzLCAwfSwgCiAgICB7MiwgNCwgMywgMCwgMX0sIAogICAgezIsIDQsIDMsIDEsIDB9LCAKICAgIHszLCAwLCAxLCAyLCA0fSwgCiAgICB7MywgMCwgMSwgNCwgMn0sIAogICAgezMsIDAsIDIsIDEsIDR9LCAKICAgIHszLCAwLCAyLCA0LCAxfSwgCiAgICB7MywgMCwgNCwgMSwgMn0sIAogICAgezMsIDAsIDQsIDIsIDF9LCAKICAgIHszLCAxLCAwLCAyLCA0fSwgCiAgICB7MywgMSwgMCwgNCwgMn0sIAogICAgezMsIDEsIDIsIDAsIDR9LCAKICAgIHszLCAxLCAyLCA0LCAwfSwgCiAgICB7MywgMSwgNCwgMCwgMn0sIAogICAgezMsIDEsIDQsIDIsIDB9LCAKICAgIHszLCAyLCAwLCAxLCA0fSwgCiAgICB7MywgMiwgMCwgNCwgMX0sIAogICAgezMsIDIsIDEsIDAsIDR9LCAKICAgIHszLCAyLCAxLCA0LCAwfSwgCiAgICB7MywgMiwgNCwgMCwgMX0sIAogICAgezMsIDIsIDQsIDEsIDB9LCAKICAgIHszLCA0LCAwLCAxLCAyfSwgCiAgICB7MywgNCwgMCwgMiwgMX0sIAogICAgezMsIDQsIDEsIDAsIDJ9LCAKICAgIHszLCA0LCAxLCAyLCAwfSwgCiAgICB7MywgNCwgMiwgMCwgMX0sIAogICAgezMsIDQsIDIsIDEsIDB9LCAKICAgIHs0LCAwLCAxLCAyLCAzfSwgCiAgICB7NCwgMCwgMSwgMywgMn0sIAogICAgezQsIDAsIDIsIDEsIDN9LCAKICAgIHs0LCAwLCAyLCAzLCAxfSwgCiAgICB7NCwgMCwgMywgMSwgMn0sIAogICAgezQsIDAsIDMsIDIsIDF9LCAKICAgIHs0LCAxLCAwLCAyLCAzfSwgCiAgICB7NCwgMSwgMCwgMywgMn0sIAogICAgezQsIDEsIDIsIDAsIDN9LCAKICAgIHs0LCAxLCAyLCAzLCAwfSwgCiAgICB7NCwgMSwgMywgMCwgMn0sIAogICAgezQsIDEsIDMsIDIsIDB9LCAKICAgIHs0LCAyLCAwLCAxLCAzfSwgCiAgICB7NCwgMiwgMCwgMywgMX0sIAogICAgezQsIDIsIDEsIDAsIDN9LCAKICAgIHs0LCAyLCAxLCAzLCAwfSwgCiAgICB7NCwgMiwgMywgMCwgMX0sIAogICAgezQsIDIsIDMsIDEsIDB9LCAKICAgIHs0LCAzLCAwLCAxLCAyfSwgCiAgICB7NCwgMywgMCwgMiwgMX0sIAogICAgezQsIDMsIDEsIDAsIDJ9LCAKICAgIHs0LCAzLCAxLCAyLCAwfSwgCiAgICB7NCwgMywgMiwgMCwgMX0sIAogICAgezQsIDMsIDIsIDEsIDB9LCAKICB9OwoKICBmb3IoaW50IGkgPSAwOyBpIDwgMTIwOyArK2kpIHsKICAgIHNvcnQ1KGFbaV0pOwogICAgdWludHByaW50NShhW2ldKTsKICB9CgogIHJldHVybiAwOwp9Cg==