Предоставляет ли функция qsort() гарантии производительности?

Требует ли стандарт C, чтобы функция стандартной библиотеки qsort() обеспечивала определенный уровень производительности? Название предполагает использование алгоритма O(n log n), такого как быстрая сортировка . Может ли библиотека, соответствующая стандартам, реализовать это с помощью сортировки вставкой O(n^2) или даже богосортировки O(n!)?

Нет, здесь не указан метод сортировки или производительность.

Weather Vane 15.03.2024 22:50

TL;DR: Нет qsort (т. е. quicksort) может быть O(n log n), но в худшем случае это может быть O(n^2). mergesort — это всегда O(n log n) время с O(n) [дополнительным] пространством. Обратите внимание, что qsort в некоторых системах использует сортировку вставками на нижних уровнях (на основе эвристики). Итак, ответ: «Это зависит»

Craig Estey 15.03.2024 22:50

Посмотрите исходный код qsort(). Это сочетание методов сортировки, оптимизированное для предотвращения наихудших сценариев, присущих быстрой сортировке. Вы не можете сделать намного лучше.

David C. Rankin 15.03.2024 22:50

Я не думаю, что он также определяет верхний предел используемого дополнительного пространства. Кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь.

Simon Goater 15.03.2024 22:56

Спецификация очень проста. Здесь ничего не говорится о сложности ни памяти, ни времени.

Barmar 15.03.2024 22:58

Точно так же имя bsearch() предполагает, что он будет выполнять двоичный поиск, и спецификация функции сравнения позволяет это, но фактических требований к этому нет.

Barmar 15.03.2024 23:02

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

Weather Vane 15.03.2024 23:03

Это то, что люди в сообществе стандартизации называют проблемой «качества реализации». Нет необходимости законодательно закреплять это в спецификации, рынок отсеет плохие проекты. Более того, сортировка — это хорошо изученная технология, и библиотекам нет оправдания использованию плохого алгоритма.

Barmar 15.03.2024 23:05

На практике очень часто это основано на Разработке функции сортировки, Bentley 1993 .

Neil 15.03.2024 23:16

Вместо «производительности» вы можете использовать такие термины, как «сложность времени выполнения» или «сложность пространства», чтобы более точно обсудить, какие аспекты масштабируемости вас интересуют.

Chris 16.03.2024 00:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно стандартам C89, C99, C11 и C17, никакого особого поведения big-O не требуется.

Это язык стандарта C89 под заголовком 7.10.5.2. Остальные стандарты содержат идентичные формулировки.

Краткое содержание

#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));

Описание

Функция qsort сортирует массив объектов nmemb, на начальный элемент которого указывает база. Размер каждого объекта определяется размером.

Содержимое массива сортируется по возрастанию в соответствии с функцией сравнения, на которую указывает функция сравнения, которая вызывается с двумя аргументами, указывающими на сравниваемые объекты. Функция должна возвращать целое число меньше, равное или большее нуля, если считается, что первый аргумент соответственно меньше, равен или больше второго.

Если два элемента сравниваются как равные, их порядок в отсортированном массиве не указан.

Возврат

Функция qsort не возвращает значения.

Стандарт не определяет конкретный алгоритм или конкретную скорость. Фактически, он делает все возможное, чтобы использовать больше алгоритмов сортировки, не требуя стабильной сортировки. Я понимаю, что это означает, что Bogosort — это совместимый со стандартами способ реализации qsort.

Другие вопросы по теме