From e44943aadbbd727d93b23a8a578ac72d00d92527 Mon Sep 17 00:00:00 2001 From: Roshan Kanwar Date: Wed, 28 Oct 2020 22:51:49 +0530 Subject: [PATCH] feat: add wiggle sort algorithm (#1265) * create wiggle_sort.cpp * used array instead of vector * update wiggle_sort.cpp * update wiggle_sort.cpp * updating DIRECTORY.md * update wiggle_sort.cpp * update wiggle_sort.cpp * update wiggle_sort.cpp * update wiggle_sort.cpp * update wiggle_sort.cpp * update wiggle_sort.cpp * update wiggle_sort.cpp * update wiggle_sort.cpp * removed swap function and used std::swap * update wiggle_sort.cpp * update wiggle_sort.cpp * Update wiggle_sort.cpp * Update wiggle_sort.cpp Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> --- DIRECTORY.md | 1 + sorting/wiggle_sort.cpp | 136 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 sorting/wiggle_sort.cpp diff --git a/DIRECTORY.md b/DIRECTORY.md index 1bdffd780..be27c717f 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -266,6 +266,7 @@ * [Strand Sort](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/sorting/strand_sort.cpp) * [Swap Sort](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/sorting/swap_sort.cpp) * [Tim Sort](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/sorting/tim_sort.cpp) + * [Wiggle Sort](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/sorting/wiggle_sort.cpp) ## Strings * [Brute Force String Searching](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/strings/brute_force_string_searching.cpp) diff --git a/sorting/wiggle_sort.cpp b/sorting/wiggle_sort.cpp new file mode 100644 index 000000000..4d75a22bb --- /dev/null +++ b/sorting/wiggle_sort.cpp @@ -0,0 +1,136 @@ +/** + * \addtogroup sorting Sorting Algorithms + * @{ + * \file + * \brief [Wiggle Sort Algorithm] + * (https://leetcode.com/problems/wiggle-sort-ii/) Implementation + * + * \author [Roshan Kanwar](http://github.com/roshan0708) + * + * \details + * Wiggle Sort sorts the array into a wave like array. + * An array ‘arr[0..n-1]’ is sorted in wave form, + * if arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= ….. + * + * \example + * arr = [1,1,5,6,1,4], after wiggle sort arr will become equal to [1,1,6,1,5,4] + * arr = [2,8,9,1,7], after wiggle sort arr will become equal to [8,2,9,1,7] + */ + +#include /// for io operations +#include +#include +#include +#include + +/** + * @namespace sorting + * @brief Sorting algorithms + */ +namespace sorting { + /** + * @namespace wiggle_sort + * @brief Functions for [Wiggle Sort](https://leetcode.com/problems/wiggle-sort-ii/) algorithm + */ + namespace wiggle_sort { + + /** + * + * @brief Function used for sorting the elements in wave form. + * @details + * Checking whether the even indexed elements are greater than + * their adjacent odd elements. + * Traversing all even indexed elements of the input arr. + * If current element is smaller than the previous odd element, swap them. + * If current element is smaller than the next odd element, swap them. + * + * @param arr input array (unsorted elements) + * + */ + template // this allows to have vectors of ints, double, float, etc + std::vector wiggleSort(const std::vector& arr) { + + uint32_t size = arr.size(); + + std::vector out(arr); // create a copy of input vector. this way, the original input vector does not get modified. a sorted array is is returned. + + for(int i = 0; i < size ; i +=2) { + + if(i > 0 && out[i-1] > out[i]) { + std::swap(out[i],out[i-1]); //swapping the two values + } + + if(i < size - 1 && out[i] < out[i+1]) { + std::swap(out[i],out[i+1]); //swapping the two values + } + + } + + return out; //returns the sorted vector + + } + } // namespace wiggle_sort +} // namespace sorting + +/** + * + * @brief Utility function used for printing the elements. + * Prints elements of the array after they're sorted using wiggle sort algorithm. + * + * @param arr array containing the sorted elements + * + */ +template +static void displayElements(const std::vector &arr) { + + uint32_t size = arr.size(); + + std::cout << "Sorted elements are as follows: "; + + std::cout << "["; + + for(int i = 0 ; i < size ; i++ ) { + + std::cout << arr[i] ; + if(i != size - 1) { + std::cout << ", " ; + } + + } + + std::cout << "]"< data1(100); + for (auto &d: data1) { // generate random numbers between -5.0 and 4.99 + d = float(std::rand() % 1000 - 500) / 100.f; + } + + std::vector sorted = sorting::wiggle_sort::wiggleSort(data1); + + displayElements(sorted); + + for(uint32_t j = 0; j < data1.size(); j+=2) { + assert(data1[j] <= data1[j+1] && data1[j+1] >= data1[j+2]); // check the validation condition + } + + std::cout << "Test 1 passed\n"; + +} + +/** Driver Code */ +int main() { + test(); + return 0; +} + +/** @} */