From c16c20b8365981fc1034aa781d1ae2024fdbba42 Mon Sep 17 00:00:00 2001 From: Pavel Shliak Date: Wed, 4 Dec 2024 23:59:19 +0400 Subject: [PATCH] AK: Fix InsertionSort to respect specified bounds Previously, it ignored 'start', sorting from the array's beginning. This caused unintended changes and slower performance. Fix ensures sorting stays within 'start' and 'end' indices only. --- AK/InsertionSort.h | 2 +- Tests/AK/TestInsertionSort.cpp | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/AK/InsertionSort.h b/AK/InsertionSort.h index 2ed2e7cab42..d9abb1fd455 100644 --- a/AK/InsertionSort.h +++ b/AK/InsertionSort.h @@ -17,7 +17,7 @@ void insertion_sort(Collection& col, ssize_t start, ssize_t end, Comparator comp 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) + for (ssize_t j = i; j > start && comparator(col[j], col[j - 1]); --j) swap(col[j], col[j - 1]); } } diff --git a/Tests/AK/TestInsertionSort.cpp b/Tests/AK/TestInsertionSort.cpp index 6939859e90a..cbe2e833cce 100644 --- a/Tests/AK/TestInsertionSort.cpp +++ b/Tests/AK/TestInsertionSort.cpp @@ -55,3 +55,26 @@ TEST_CASE(sorts_decending) } } } + +TEST_CASE(sorts_subrange_without_affecting_outside_elements) +{ + Vector ints = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; + Vector const original_ints = ints; + + ssize_t const start = 3; + ssize_t const end = 6; + + insertion_sort(ints, start, end, [](auto& a, auto& b) { return a < b; }); + + for (ssize_t i = start; i < end; ++i) { + EXPECT(ints[i] <= ints[i + 1]); + } + + for (ssize_t i = 0; i < start; ++i) { + EXPECT_EQ(ints[i], original_ints[i]); + } + + for (ssize_t i = end + 1; i < static_cast(ints.size()); ++i) { + EXPECT_EQ(ints[i], original_ints[i]); + } +}