From ed5dbbb006f1b9df9ee5836007de9d2b549881e9 Mon Sep 17 00:00:00 2001 From: Lajat5 Date: Mon, 27 Sep 2021 03:43:54 +0530 Subject: [PATCH] Reworked selection_sort.cpp with fixes. --- sorting/selection_sort.cpp | 143 ++++++++++++++++++++++++++++++------- 1 file changed, 118 insertions(+), 25 deletions(-) diff --git a/sorting/selection_sort.cpp b/sorting/selection_sort.cpp index 3854f52e6..671723eda 100644 --- a/sorting/selection_sort.cpp +++ b/sorting/selection_sort.cpp @@ -1,33 +1,126 @@ -// Selection Sort +/****************************************************************************** + * @file + * @brief Implementation of the [Selection + *sort](https://en.wikipedia.org/wiki/Selection_sort) implementation using + *swapping + * @details + * The selection sort algorithm divides the input array into two parts: a sorted + * subarray of items which is built up from left to right at the front (left) of + * the array, and a subarray of the remaining unsorted items that occupy the + *rest of the array. Initially, the sorted subarray is empty, and the unsorted + *subarray is the entire input array. The algorithm proceeds by finding the + *smallest (or largest, depending on the sorting order) element in the unsorted + *subarray, exchanging (swapping) it with the leftmost unsorted element (putting + *it in sorted order), and moving the subarray boundaries one element to the + *right. + * + * ### Implementation + * + * SelectionSort + * The algorithm divides the input array into two parts: the subarray of items + * already sorted, which is built up from left to right. Initially, the sorted + * subarray is empty and the unsorted subarray is the entire input array. The + * algorithm proceeds by finding the smallest element in the unsorted subarray, + * exchanging (swapping) it with the leftmost unsorted element (putting it in + * sorted order), and moving the subarray boundaries one element to the right. + * + * @author [Lajat Manekar](https://github.com/Lazeeez) + *******************************************************************************/ +#include ///for std::is_sorted +#include ///for std::array +#include ///for assert +#include ///for io operations -#include -using namespace std; +/****************************************************************************** + * @namespace sorting + * @brief Sorting algorithms + *******************************************************************************/ +namespace sorting { -int main() { - int Array[6]; - cout << "\nEnter any 6 Numbers for Unsorted Array : "; +/****************************************************************************** + * @brief The main function which implements Selection sort + * @param nums array to be sorted:-> array datatype, array length, + * @param len length of array to be sorted, + * @returns void + *******************************************************************************/ - // Input - for (int i = 0; i < 6; i++) { - cin >> Array[i]; - } - - // Selection Sorting - for (int i = 0; i < 6; i++) { - int min = i; - for (int j = i + 1; j < 6; j++) { - if (Array[j] < Array[min]) { - min = j; // Finding the smallest number in Array +void selectionSort( + std::array& arr, + int len) { // Array size is const, can be modified by replacing "8" at (Ln + // 45, Col 21) & (Ln 45, Col 60). + for (auto it = 0; it < len; ++it) { + int min = it; // set min value + for (auto it2 = it + 1; it2 < len + 1; ++it2) { + if (arr[it2] < arr[min]) { // check which element is smaller + min = it2; // store index of smallest element to min } } - int temp = Array[i]; - Array[i] = Array[min]; - Array[min] = temp; - } - // Output - cout << "\nSorted Array : "; - for (int i = 0; i < 6; i++) { - cout << Array[i] << "\t"; + if (min != it) { // swap if min does not match to i + int tmp = arr[min]; + arr[min] = arr[it]; + arr[it] = tmp; + } } } +} // namespace sorting + +/******************************************************************************* + * @brief Self-test implementations + * @returns void + *******************************************************************************/ +static void test() { + // testcase #1 + // [1, 0, 0, 1, 1, 0, 2, 1] return [0, 0, 0, 1, 1, 1, 1, 2] + std::array array1 = { + {1, 0, 0, 1, 1, 0, 2, 1}}; // Array size is const, can be modified by + // replacing "8" at (Ln 71, Col 21). + int array1size = array1.size(); + std::cout << "1st test... "; + sorting::selectionSort(array1, array1size); + assert(std::is_sorted(array1.begin(), array1.end())); + std::cout << "Passed" << std::endl; + + // testcase #2 + // [19, 22, 540, 241, 156, 140, 12, 1] return [1, 12, 19, 22, 140, 156, 241, + // 540] + std::array array2 = {{19, 22, 540, 241, 156, 140, 12, + 1}}; // Array size is const, can be modified + // by replacing "8" at (Ln 81, Col 21). + int array2size = array2.size(); + std::cout << "2nd test... "; + sorting::selectionSort(array2, array2size); + assert(std::is_sorted(array2.begin(), array2.end())); + std::cout << "Passed" << std::endl; + + // testcase #3 + // [11, 20, 30, 41, 15, 60, 82, 15] return [11, 15, 15, 20, 30, 41, 60, 82] + std::array array3 = {{11, 20, 30, 41, 15, 60, 82, + 15}}; // Array size is const, can be modified + // by replacing "8" at (Ln 90, Col 21). + int array3size = array3.size(); + std::cout << "3rd test... "; + sorting::selectionSort(array3, array3size); + assert(std::is_sorted(array3.begin(), array3.end())); + std::cout << "Passed" << std::endl; + + // testcase #4 + // [1, 9, 11, 546, 26, 65, 212, 14] return [1, 9, 11, 14, 26, 65, 212, 546] + std::array array4 = {{1, 9, 11, 546, 26, 65, 212, + 14}}; // Array size is const, can be modified + // by replacing "8" at (Ln 99, Col 21). + int array4size = array2.size(); + std::cout << "4th test... "; + sorting::selectionSort(array4, array4size); + assert(std::is_sorted(array4.begin(), array4.end())); + std::cout << "Passed" << std::endl; +} + +/******************************************************************************* + * @brief Main function + * @returns 0 on exit + *******************************************************************************/ +int main() { + test(); // run self-test implementations + return 0; +} \ No newline at end of file