1. Си / Говнокод #29288

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    void sort(void *a, int n, int size, int (*cmp)(const void*, const void*)) {
    	int j;
    	if (n <= 1) return;
    	if (n == 2) {
    		if (cmp(a + size*1, a)) {
    			for (j = 0; j < size; j++) {
    				SWAP(*(char*)(a + j + size), *(char*)(a + j));
    			}
    		}
    		return;
    	}
    	int d, p = 0, i;
    	for (i = 1; i < n; i++) {
    		if (cmp(a + size*i, a + size*(i-1))) { d = i; goto sorting; }
    	}
    	return;
    sorting:
    	static char buf[128];
    	memcpy(buf, a + size*d, size);
    	for (i = 0; i < n; i++) {
    		if (!cmp(buf, a + i*size)) {
    			for (j = 0; j < size; j++) {
    				SWAP(*(char*)(a + j + i*size), *(char*)(a + j + p*size));
    			}
    			p++;
    		}
    	}
    	sort(a, p, size, cmp);
    	sort(a+p*size, n-p, size, cmp);
    }

    Попросили по программированию в универе написать сортировку на С. Написал.

    Запостил: anime-girl, 15 Октября 2026

    Комментарии (30) RSS

    • Почему сортировка именно со списком аргументов quicksort, но с другим компаратором? Первое -- требование, второе -- потому что могу
      Ответить
    • > a + size*1
      сразу видно — программист!
      Ответить
      • это для дезинформации потенциального противника. Да и кому не всё равно, GCC соптимизирует
        Ответить
      • Программист поставил стакан с водой на случай если захочет пить
        И пустой наслучай если не захочет
        Ответить
    • Самое прекрасное в этой функции что она работает же. А если она у вас упадет потому, что у вас размеры типов не совпали или потому что вы ее с двух потоков запустили, так это ваши проблемы. и что вам дейкстры в уши насрали что goto это плохо это тоже ваши проблемы.
      Ответить
      • > она работает

        Ты проверял?
        Ответить
        • Конечно. правда мы с компилятором не знали кто такой SWAP, потому переписали на std::swap, но она скомпилировалось
          Ответить
          • Старое доброе "скомпилировалось, значит, работает", как в 80-х...

            SWAP, очевидно, вот такой вот:
            #define SWAP(X,Y) do { __auto_type _swap_tmp = (X); (X) = (Y); (Y) = _swap_tmp; } while (0)

            чтоб можно было написать SWAP(array[index++], array[other_index]); и радоваться результату
            Ответить
            • Красиво. Одно значение клонируется, ещё одно потеряется (из-за двух инкрементов). Т. е. в пределе весь массив будет заполнен одним значением.
              Ответить
            • Тоесть ты упустил самое интересное (макрос SWAP)

              –Вы слыхали, Петров-то наш амбидекстер!
              –Кто??
              –Петров!
              Ответить
              • Так это же почти один-в-один макрос из linux

                https://github.com/torvalds/linux/blob/045958acaa75205b31578cb22c4345e28dd2e4bf/include/linux/minmax.h#L308
                Ответить
                • Он ещё и маленькими буквами назван, чтобы его с функцией спутали... Вот это точно в палату мер и весов!

                  Напомнило, как приходится делать пачку #undef после того, как включил какой-нибудь заголовок из Windows SDK. Если не сделать #undef, весь код плывёт.
                  Ответить
            • > Старое доброе "скомпилировалось, значит, работает", как в 80-х...


              Ну кстати со стеной может и не скомпилируется: ты память измеряешь в интах, как в борланд си три ноль в 1992-м году

              \
              Ответить
              • Память можно измерять в интах, а более того, про size_t препод ещё не рассказывал, не хочу его сильно пугать.

                К тому же, складывать всё в int, пока влезает -- очень привычно для так называемых "олимпиадников"
                Ответить
                • У препода методички не обновлялись после выхода C99?
                  Ответить
                  • сдается мне, писались методички не без помощи нейросеток, так что, пожалуй, обновлялись. Но последовательность изложения материала действительно странная.
                    Ответить
      • А что до запуска с двух потоков, это всё равно херня затея, потому что qsort-овский компаратор для этого не подходит, если нужно больше данных, чем только то, что лежит в аргументах. qsort_r не зря появился
        Ответить
      • Или если у вас там ебучие структуры больше 128 char
        Ответить
        • Если кто-то сортирует структуры размером больше 128 байт, то он сам себе злобный буратина.
          Ответить
          • Ну впринципе согласен, если у вас что-то болье 128 байт то вы положите это в кучу и арботайте по указателю
            Ответить
          • правильно, сишникам вообще запрещено оперировать типами, которые могут оказаться длиннее восьми байт, да и те существуют только для неофитов
            Ответить
            • Ну просто восемь бит это прямо вот очень дохуя. Если ты конечно конечно скриптовик или жавамэн то тебе восемь байт как раз на один булевый флажок хватит, но если ты царь, то ты прекрасно понимаешь как это бесконечно много.
              Ответить
            • 8 байт — это один double, один поинтер 64-битный или один 64-битный же size_t. Царь, можно мне хотя бы dvector3 сделать?
              Ответить
              • > 8 байт — это один double,

                плавающие петухи не нужны, большинство задач можно решить целичисленными типами
                У древних людей и FPU-то никакого не было.

                > один поинтер 64-битный

                У дренвих людей поинтер был два байта, и ничего, как-то справлялись.
                Ответить
                • можно вообще просто четыре гига аллокнуть и ходить по ним 32 битами. нахуй вам больше?
                  Ответить
                  • Тебе даже V86 для этого не нужен: надо флажок у сегмента перевенуть, и снова третье сенидцать два байта
                    Ответить
              • Это всё тем более забавно, что в самом компиляторе есть поддержка вещей навроде __m256i (вектор из четырех лонгов)
                Ответить
                • да как бы и не только в компиляторе, такой тип появился по некоторой причине
                  Ответить
                  • бОльшая часть существующего ныне всего появилась в некоторый момент по некоторой причине
                    Ответить
    • Лаба.
      Ответить

    Добавить комментарий