/** * @file * @brief Bubble sort algorithm * * @details * Bubble sort algorithm is the bubble sorting algorithm. The most important reason * for calling the bubble is that the largest number is thrown at the end of this * algorithm. This is all about the logic. In each iteration, the largest number is * expired and when iterations are completed, the sorting takes place. * * What is Swap? * * Swap in the software means that two variables are displaced. * An additional variable is required for this operation. x = 5, y = 10. * We want x = 10, y = 5. Here we create the most variable to do it. * * ```cpp * int z; * z = x; * x = y; * y = z; * ``` * * The above process is a typical displacement process. * When x assigns the value to x, the old value of x is lost. * That's why we created a variable z to create the first value of the value of x, * and finally, we have assigned to y. * * ## Bubble Sort Algorithm Analysis (Best Case - Worst Case - Average Case) * * ### Best Case * Bubble Sort Best Case Performance. \f$O(n)\f$. However, you * can't get the best status in the code we shared above. This happens on the * optimized bubble sort algorithm. It's right down there. * * ### Worst Case * Bubble Sort Worst Case Performance is \f$O(n^{2})\f$. Why is that? Because if you * remember Big O Notation, we were calculating the complexity of the algorithms in * the nested loops. The \f$n * (n - 1)\f$ product gives us \f$O(n^{2})\f$ performance. In the * worst case all the steps of the cycle will occur. * * ### Average Case * Bubble Sort is not an optimal algorithm. In average, \f$O(n^{2})\f$ performance is taken. * * @author [Deepak](https://github.com/Deepak-j-p) * @author [Nguyen Phuc Chuong](https://github.com/hollowcrust) */ #include /// for std::is_sorted #include /// for assert #include /// for IO implementations #include /// for std::string #include /// for std::pair, std::swap #include /// for std::vector, std::vector::push_back, std::vector::size /** * @namespace sorting * @brief Sorting algorithms */ namespace sorting { /** * @namespace bubble_sort * @brief Bubble sort algorithm */ namespace bubble_sort { /** * @brief Bubble sort algorithm * @param array An array to be sorted * @return The array sorted in ascending order */ template std::vector bubble_sort(std::vector& array) { // swap_check flag to terminate the function early // if there is no swap occurs in one iteration. bool swap_check = true; int size = array.size(); for (int i = 0; (i < size) && (swap_check); i++) { swap_check = false; for (int j = 0; j < size - 1 - i; j++) { if (array[j] > array[j + 1]) { swap_check = true; std::swap(array[j], array[j + 1]); } } } return array; } } // namespace bubble_sort } // namespace sorting /** * @brief Self-test implementation * @return void */ static void test() { std::vector vec_1 = {3, 1, -9, 0}; std::vector sorted_1 = sorting::bubble_sort::bubble_sort(vec_1); std::vector vec_2 = {3}; std::vector sorted_2 = sorting::bubble_sort::bubble_sort(vec_2); std::vector vec_3 = {10, 10, 10, 10, 10}; std::vector sorted_3 = sorting::bubble_sort::bubble_sort(vec_3); std::vector vec_4 = {1234, -273.1, 23, 150, 1234, 1555.55, -2000}; std::vector sorted_4 = sorting::bubble_sort::bubble_sort(vec_4); std::vector vec_5 = {'z', 'Z', 'a', 'B', ' ', 'c', 'a'}; std::vector sorted_5 = sorting::bubble_sort::bubble_sort(vec_5); std::vector vec_6 = {"Hello", "hello", "Helo", "Hi", "hehe"}; std::vector sorted_6 = sorting::bubble_sort::bubble_sort(vec_6); std::vector> vec_7 = {{10, 'c'}, {2, 'z'}, {10, 'a'}, {0, 'b'}, {-1, 'z'}}; std::vector> sorted_7 = sorting::bubble_sort::bubble_sort(vec_7); assert(std::is_sorted(sorted_1.begin(), sorted_1.end())); assert(std::is_sorted(sorted_2.begin(), sorted_2.end())); assert(std::is_sorted(sorted_3.begin(), sorted_3.end())); assert(std::is_sorted(sorted_4.begin(), sorted_4.end())); assert(std::is_sorted(sorted_5.begin(), sorted_5.end())); assert(std::is_sorted(sorted_6.begin(), sorted_6.end())); assert(std::is_sorted(sorted_7.begin(), sorted_7.end())); } /** * @brief Main function * @return 0 on exit */ int main() { test(); return 0; }