Il s'agit d'un projet visant à être une implémentation de manuel de structures de données et d'algorithmes communs. Il fournit à la fois une implémentation de démonstration et des tests unitaires.
Le code est destiné à être propre et simple , et l'efficacité n'est pas l'objectif principal. J'écrirai l'implémentation la plus efficace en termes de complexité de calcul ou fournirai la mise en œuvre de différentes versions.
Exemple de code:
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);
}
}Si vous souhaitez pratiquer vos compétences de codage, téléchargez simplement le projet et réécrivez les algorithmes pertinents et exécutez vous-même les tests unitaires.
Lorsque vous implémentez un algorithme qui nécessite d'autres algorithmes ou structures de données, vous pouvez simplement utiliser l'implémentation existante dans la bibliothèque standard ou dans le repo et vous concentrer sur les idées principales, par exemple:
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);
} Dans l'exemple ci-dessus, partition (implémentée dans le repo) est garantie pour renvoyer deux gammes non vides si la longueur de la plage d'entrée est supérieure à celle que nous sommes assurés que les deux appels de récursivité suivants se produiront sur des dimensions plus petites.
Vous êtes accueilli pour contribuer à ce projet par soit: