[ Останні оновлення: програма порівняння та попередні результати доступні, див. Нижче]
Тому я хочу перевірити компроміс швидкості / складності за допомогою класичного застосування: сортування.
Напишіть функцію ANSI C, яка сортує масив чисел з плаваючою точкою у порядку збільшення .
Ви не можете використовувати будь-які бібліотеки, системні дзвінки, багатопотокові чи вбудовані ASM.
Записи судяться за двома компонентами: довжиною коду та продуктивністю. Оцінка за наступним чином: записи будуть відсортовані за довжиною (журнал #characters без пробілу, так що ви можете зберегти деяке форматування) та за продуктивністю (журнал # секунди за еталоном), і кожен інтервал [найкращий, найгірший] лінійно нормалізується на [ 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 GMT). Я опублікую тест через 2 тижні.
Можливо, доцільно буде розміщувати до крайнього строку, щоб уникнути передачі коду конкурентам.
Попередні результати щодо публікації еталону:
Ось деякі результати. В останньому стовпчику показник відображається у відсотках, чим вище, тим краще, ставлячи Джонні Кейдж на перше місце. Алгоритми, які були на порядок повільніші за решту, виконувались на підмножині тестів, а час екстраполювався. qsort
Для порівняння включений власний C (Джонні швидший!). Я завершу підсумкове порівняння під час закриття.