// Returns Sorted elements after performing Cocktail Selection Sort // It is a Sorting algorithm which chooses the minimum and maximum element in an // array simultaneously, and swaps it with the lowest and highest available // position iteratively or recursively #include #include #include // Iterative Version void CocktailSelectionSort(std::vector &vec, int low, int high) { while (low <= high) { int minimum = vec[low]; int minimumindex = low; int maximum = vec[high]; int maximumindex = high; for (int i = low; i <= high; i++) { if (vec[i] >= maximum) { maximum = vec[i]; maximumindex = i; } if (vec[i] <= minimum) { minimum = vec[i]; minimumindex = i; } } if (low != maximumindex || high != minimumindex) { std::swap(vec[low], vec[minimumindex]); std::swap(vec[high], vec[maximumindex]); } else { std::swap(vec[low], vec[high]); } low++; high--; } } // Recursive Version void CocktailSelectionSort_v2(std::vector &vec, int low, int high) { if (low >= high) return; int minimum = vec[low]; int minimumindex = low; int maximum = vec[high]; int maximumindex = high; for (int i = low; i <= high; i++) { if (vec[i] >= maximum) { maximum = vec[i]; maximumindex = i; } if (vec[i] <= minimum) { minimum = vec[i]; minimumindex = i; } } if (low != maximumindex || high != minimumindex) { std::swap(vec[low], vec[minimumindex]); std::swap(vec[high], vec[maximumindex]); } else { std::swap(vec[low], vec[high]); } CocktailSelectionSort(vec, low + 1, high - 1); } // main function, select any one of iterative or recursive version int main() { int n; std::cout << "Enter number of elements\n"; std::cin >> n; std::vector v(n); std::cout << "Enter all the elements\n"; for (int i = 0; i < n; ++i) { std::cin >> v[i]; } int method; std::cout << "Enter method: \n\t0: iterative\n\t1: recursive:\t"; std::cin >> method; if (method == 0) { CocktailSelectionSort(v, 0, n - 1); } else if (method == 1) { CocktailSelectionSort_v2(v, 0, n - 1); } else { std::cerr << "Unknown method" << std::endl; return -1; } std::cout << "Sorted elements are\n"; for (int i = 0; i < n; ++i) { std::cout << v[i] << " "; } return 0; }