Это проект, направленный на то, чтобы стать внедрением учебного книги общих структур данных и алгоритмов. Он обеспечивает как демонстрационную реализацию, так и модульные тесты.
Код предназначен для того, чтобы быть чистым и простым , и эффективность не является основной целью. Я напишу наиболее эффективную реализацию с точки зрения сложности вычислений или обеспечить реализацию различных версий.
Пример кода:
template < class Iter >
void linearInsert (Iter first, Iter last)
{
auto insertionPoint = std::upper_bound (first, last, *last);
std::rotate (insertionPoint, last, last + 1 );
}
template < class Iter >
void insertionSort (Iter first, Iter last)
{
// [begin, p) sorted
// [p, end) to be processed
for ( auto p = first; p != last; ++p) {
linearInsert (first, p);
}
}Если вы хотите практиковать свои навыки кодирования, просто загрузите проект и переписывайте соответствующие алгоритмы и запустите модульные тесты самостоятельно.
Когда вы реализуете алгоритм, который требует других алгоритмов или структур данных, вы можете просто использовать существующую реализацию в стандартной библиотеке или в репо и сосредоточиться на основных идеях, например:
template < class Iter >
void quickSort (Iter first, Iter last)
{
if (last - first <= 1 ) {
return ;
}
auto partitionPoint = partition (first, last);
quickSort (first, partitionPoint);
quickSort (partitionPoint, last);
} В приведенном выше примере partition (реализованный в репо) гарантированно вернет два непустых диапазона, если длина входного диапазона, если больше одного, так что мы уверены, что оба следующих рекурсионных вызовов будут происходить в меньших размерах.
Вам приветствуется, чтобы внести свой вклад в этот проект любым: