[ Последнее обновление: эталонная программа и предварительные результаты доступны, см. Ниже]
Поэтому я хочу проверить компромисс между скоростью и сложностью с классическим приложением: сортировка.
Напишите функцию ANSI C, которая сортирует массив чисел с плавающей точкой в порядке возрастания .
Вы не можете использовать любые библиотеки, системные вызовы, многопоточность или встроенный ASM.
Записи оцениваются по двум компонентам: длина кода и производительность. Оценки следующим образом: записи будут отсортированы по длине (журнал #characters без пробелов, так что вы можете сохранить некоторое форматирование) и производительности (журнал #seconds за тест), и каждый интервал [лучший, худший] линейно нормализуется до [ 0,1]. Общий балл программы будет средним из двух нормализованных баллов. Самый низкий балл побеждает. Одна запись на пользователя.
Сортировка должна (в конечном итоге) быть на месте (т. Е. Входной массив должен содержать отсортированные значения во время возврата), и вы должны использовать следующую подпись, включая имена:
void sort(float* v, int n) {
}
Подсчитываемые символы: символы в sort
функции, включая подпись, плюс дополнительные функции, вызываемые ею (но не включая код тестирования).
Программа должна обрабатывать любые числовые значения float
и массивы длиной> = 0, вплоть до 2 ^ 20.
Я подключу sort
и его зависимости к тестирующей программе и скомпилирую на GCC (никаких изящных опций). Я добавлю в него кучу массивов, проверим правильность результатов и общее время выполнения. Тесты будут проводиться на Intel Core i7 740QM (Clarksfield) под Ubuntu 13.
Длины массивов будут охватывать весь допустимый диапазон с более высокой плотностью коротких массивов. Значения будут случайными, с распределением «толстый хвост» (как в положительном, так и в отрицательном диапазонах). Дублированные элементы будут включены в некоторые тесты.
Тестовая программа доступна здесь: https://gist.github.com/anonymous/82386fa028f6534af263.
Импортирует отправку как user.c
. Количество тестовых случаев ( TEST_COUNT
) в фактическом тесте будет 3000. Пожалуйста, оставьте любые отзывы в комментариях к вопросу.
Срок подачи заявок: 3 недели (7 апреля 2014 года, 16:00 по Гринвичу). Я опубликую тест через 2 недели.
Может быть целесообразно размещать сообщения ближе к крайнему сроку, чтобы избежать раздачи вашего кода конкурентам.
Предварительные результаты, по состоянию на публикацию тестов:
Вот некоторые результаты. В последнем столбце отображается процентное соотношение, чем выше, тем лучше, ставя Джонни Кейджа на первое место. Алгоритмы, которые были на несколько порядков медленнее остальных, выполнялись на подмножестве тестов, и время экстраполировалось. Собственное С qsort
включено для сравнения (Джонни быстрее!). Я сделаю окончательное сравнение во время закрытия.