Упорядочение: степень поддержки C для чего-либо вроде ассоциативного массива будет qsort
для сортировки массива структур на основе ключа и bsearch
для поиска структуры на основе ключа.Есть, конечно, немало альтернатив - в разных других библиотеках есть хеш-таблицы, сбалансированные деревья и т. Д. Точно о том, что подойдет для ваших целей, сложно догадаться.
Необязательно, я не знаюмного хороших книг, посвященных алгоритмам, которые используют C в качестве основного средства демонстрации.Вот несколько очевидных рекомендаций для книг по алгоритмам в целом (в основном не зависящих от языка):
Искусство компьютерного программирования Дональда Кнута.Это в значительной степени книга алгоритмов класса .Сейчас (наконец) до четырех томов.Изначально Кнут начал работу над ним в 1967 году, планируя написать 7 томов.Только три тома были доступны в течение длинного времени.Четвертый был добавлен совсем недавно.При такой скорости он достигнет 7, только если Кнут доживет до 100 лет.Тем не менее, части, которые там есть, чрезвычайно хороши - но (предупреждение!) Он анализирует алгоритмы в значительных деталях;если вы не знаете хотя бы небольшого исчисления, вероятно, будет трудно следовать изрядной сумме.
Введение в алгоритмы от Cormen, Leiserson, Rivest иШтейн.IIRC, теперь есть более новое издание, чем у меня, которое добавляет еще одного автора.Это большая книга (уронить ее на носки было бы очень больно).В нем используется значительное количество математических обозначений и тому подобное, но если вы хотите немного поработать над поиском обозначений, это действительно довольно понятно.Он охватывает довольно много важных основ (например, алгоритмы графа), которые запланированы для более поздних томов Кнута, но недоступны (по крайней мере, пока) там.
Алгоритмы иСтруктуры данных Ахо, Хопкрафта и Уллмана.Это (довольно справедливо) самый маленький, самый легкий и, по крайней мере, для большинства людей, вероятно, самый простой из них.
Хотя он доступен только для использования, если вы можетенайдите копию Algorithms + Структуры данных = Программы от Niklaus Wirth, это то, что я действительно рекомендую.Он использует Паскаль (неудивительно - Никлаус Вирт изобрел Паскаль), но этого достаточно, как С, чтобы это не вызывало реальной проблемы.Это не так глубоко, как Кнут, о каждом алгоритме, но все же достаточно, чтобы дать хорошее представление о том, когда один из них может быть хорошим выбором по сравнению с другим.Для кого-то на вашей должности (некоторый опыт в программировании, но мало в этой области) это моя главная рекомендация.
Хотя я уже говорил это, думаю, стоит повторить: ИМО,следует избегать всех книг Роберта Седжвика по алгоритмам. Алгоритмы в C ++ , вероятно, являются худшими из них, но остальные только незначительно лучше.Код, который они включают (опять же, особенно версия C ++), действительно выполним, а описания алгоритмов часто неполны и / или вводят в заблуждение.В последних выпусках исправлено некоторых проблем, но (IMO) недостаточно для того, чтобы их можно было рекомендовать.Если бы не было никакой альтернативы, вы могли бы , вероятно, обойтись с этими, но учитывая количество альтернатив, которые значительно превосходят, единственная причина читать их вообще, если кто-то дает их вам, и вы абсолютно не может позволить себе что-нибудь еще.
Что касается алгоритмов в сравнении с шаблонами проектирования, то линия может местами размыться, но в целом алгоритм гораздо более четко определен.Алгоритм обычно имеет конкретный, строго определенный ввод, который он обрабатывает особым образом для получения одинаково конкретного результата / вывода.Шаблон дизайна имеет тенденцию быть более свободно определенным, более общим.Алгоритм также может быть универсальным (например, для алгоритмов сортировки может потребоваться тип, который определяет строгое, слабое упорядочение), но все еще предъявляются специфические требования к типу.
Шаблон проектирования имеет тенденциюбыть несколько более свободно определенным.Например, шаблон посетителя включает в себя обработку групп объектов - но мы не хотим изменять типы этих объектов, когда решаем, что нам нужно обрабатывать их новым и другим способом.Мы делаем это, определяя процессы отдельно от обрабатываемых объектов, а также то, как мы проходим группы объектов и позволяем процессу работать с каждым.
Чтобы взглянуть на это с довольно разныхНаправление, вы обычно можете реализовать алгоритм с функцией или небольшой группой функций.Шаблон проектирования имеет тенденцию больше ориентироваться на стиль, в котором вы пишете свой код, а не просто «вот функция, используйте ее».