/* * Copyright (c) 2022, Marc Luqué * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace AK { // Standard Insertion Sort, with `end` inclusive! template()[declval()])> void insertion_sort(Collection& col, ssize_t start, ssize_t end, Comparator comparator) requires(Indexable) { for (ssize_t i = start + 1; i <= end; ++i) { for (ssize_t j = i; j > 0 && comparator(col[j], col[j - 1]); --j) swap(col[j], col[j - 1]); } } template()[declval()])> void insertion_sort(Collection& collection, Comparator comparator) requires(Indexable) { if (collection.size() == 0) return; insertion_sort(collection, 0, collection.size() - 1, move(comparator)); } template()[declval()])> void insertion_sort(Collection& collection) requires(Indexable) { if (collection.size() == 0) return; insertion_sort(collection, 0, collection.size() - 1, [](auto& a, auto& b) { return a < b; }); } } using AK::insertion_sort;