From 1e363ee29fdcceae70acdecbe11161b5e081cd47 Mon Sep 17 00:00:00 2001 From: MaximSmolskiy Date: Tue, 23 Apr 2024 13:00:55 +0300 Subject: [PATCH 1/5] fix: fix bug in timSort --- sorting/tim_sort.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/sorting/tim_sort.cpp b/sorting/tim_sort.cpp index 94f5aa230b3..b0429e851c8 100644 --- a/sorting/tim_sort.cpp +++ b/sorting/tim_sort.cpp @@ -1,6 +1,8 @@ // C++ program to perform TimSort. #include +#include #include +#include const int RUN = 32; @@ -74,7 +76,7 @@ void timSort(int arr[], int n) { for (int left = 0; left < n; left += 2 * size) { // find ending point of left sub array // mid+1 is starting point of right sub array - int mid = left + size - 1; + int mid = std::min((left + size - 1), (n - 1)); int right = std::min((left + 2 * size - 1), (n - 1)); // merge sub array arr[left.....mid] & arr[mid+1....right] @@ -89,8 +91,23 @@ void printArray(int arr[], int n) { std::cout << std::endl; } +void test(int n) { + int *arr = new int[n]; + + std::iota(arr, arr + n, 0); + std::reverse(arr, arr + n); + assert(!std::is_sorted(arr, arr + n)); + + timSort(arr, n); + assert(std::is_sorted(arr, arr + n)); + + delete[] arr; +} + // Driver program to test above function int main() { + test(65); + int arr[] = {5, 21, 7, 23, 19}; int n = sizeof(arr) / sizeof(arr[0]); printf("Given Array is\n"); From f238dd14148b8e20345692e071f45ed835e7790f Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Fri, 23 Aug 2024 01:02:06 +0300 Subject: [PATCH 2/5] Apply suggestions from code review Co-authored-by: realstealthninja <68815218+realstealthninja@users.noreply.github.com> --- sorting/tim_sort.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sorting/tim_sort.cpp b/sorting/tim_sort.cpp index b0429e851c8..1fba53ac7b0 100644 --- a/sorting/tim_sort.cpp +++ b/sorting/tim_sort.cpp @@ -91,8 +91,13 @@ void printArray(int arr[], int n) { std::cout << std::endl; } -void test(int n) { - int *arr = new int[n]; +/** + * @brief self-test implementation + * @returns void + */ +void test() { + // Case: array of length 65 + int arr[65]; std::iota(arr, arr + n, 0); std::reverse(arr, arr + n); @@ -101,12 +106,11 @@ void test(int n) { timSort(arr, n); assert(std::is_sorted(arr, arr + n)); - delete[] arr; } // Driver program to test above function int main() { - test(65); + tests(); int arr[] = {5, 21, 7, 23, 19}; int n = sizeof(arr) / sizeof(arr[0]); From 165d83a0bcdfe8a6907d67c4ac472b467d81e815 Mon Sep 17 00:00:00 2001 From: MaximSmolskiy Date: Fri, 23 Aug 2024 01:08:10 +0300 Subject: [PATCH 3/5] Fix --- sorting/tim_sort.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sorting/tim_sort.cpp b/sorting/tim_sort.cpp index 1fba53ac7b0..8837e703b07 100644 --- a/sorting/tim_sort.cpp +++ b/sorting/tim_sort.cpp @@ -95,17 +95,17 @@ void printArray(int arr[], int n) { * @brief self-test implementation * @returns void */ -void test() { +void tests() { // Case: array of length 65 - int arr[65]; + constexpr int N = 65; + int arr[N]; - std::iota(arr, arr + n, 0); - std::reverse(arr, arr + n); - assert(!std::is_sorted(arr, arr + n)); - - timSort(arr, n); - assert(std::is_sorted(arr, arr + n)); + std::iota(arr, arr + N, 0); + std::reverse(arr, arr + N); + assert(!std::is_sorted(arr, arr + N)); + timSort(arr, N); + assert(std::is_sorted(arr, arr + N)); } // Driver program to test above function From 03d7c15169d4a44c74103c93557ca5a3298b361d Mon Sep 17 00:00:00 2001 From: realstealthninja <68815218+realstealthninja@users.noreply.github.com> Date: Fri, 23 Aug 2024 06:01:17 +0530 Subject: [PATCH 4/5] Update sorting/tim_sort.cpp --- sorting/tim_sort.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorting/tim_sort.cpp b/sorting/tim_sort.cpp index 8837e703b07..064c0eab459 100644 --- a/sorting/tim_sort.cpp +++ b/sorting/tim_sort.cpp @@ -110,7 +110,7 @@ void tests() { // Driver program to test above function int main() { - tests(); + tests(); // run self test implementations int arr[] = {5, 21, 7, 23, 19}; int n = sizeof(arr) / sizeof(arr[0]); From 8e983ba885389edea8799c53d25444f32f8e4c88 Mon Sep 17 00:00:00 2001 From: MaximSmolskiy Date: Sun, 1 Sep 2024 23:28:38 +0300 Subject: [PATCH 5/5] Add const --- sorting/tim_sort.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sorting/tim_sort.cpp b/sorting/tim_sort.cpp index 064c0eab459..a9ef0459c0e 100644 --- a/sorting/tim_sort.cpp +++ b/sorting/tim_sort.cpp @@ -10,7 +10,7 @@ const int RUN = 32; // atmost RUN void insertionSort(int arr[], int left, int right) { for (int i = left + 1; i <= right; i++) { - int temp = arr[i]; + const int temp = arr[i]; int j = i - 1; while (arr[j] > temp && j >= left) { arr[j + 1] = arr[j]; @@ -23,7 +23,7 @@ void insertionSort(int arr[], int left, int right) { // merge function merges the sorted runs void merge(int arr[], int l, int m, int r) { // original array is broken in two parts, left and right array - int len1 = m - l + 1, len2 = r - m; + const int len1 = m - l + 1, len2 = r - m; int *left = new int[len1], *right = new int[len2]; for (int i = 0; i < len1; i++) left[i] = arr[l + i]; for (int i = 0; i < len2; i++) right[i] = arr[m + 1 + i]; @@ -76,8 +76,8 @@ void timSort(int arr[], int n) { for (int left = 0; left < n; left += 2 * size) { // find ending point of left sub array // mid+1 is starting point of right sub array - int mid = std::min((left + size - 1), (n - 1)); - int right = std::min((left + 2 * size - 1), (n - 1)); + const int mid = std::min((left + size - 1), (n - 1)); + const int right = std::min((left + 2 * size - 1), (n - 1)); // merge sub array arr[left.....mid] & arr[mid+1....right] merge(arr, left, mid, right); @@ -113,7 +113,7 @@ int main() { tests(); // run self test implementations int arr[] = {5, 21, 7, 23, 19}; - int n = sizeof(arr) / sizeof(arr[0]); + const int n = sizeof(arr) / sizeof(arr[0]); printf("Given Array is\n"); printArray(arr, n);