diff --git a/cpp/Cocktail Sort.cpp b/cpp/Cocktail Sort.cpp new file mode 100644 index 0000000..4d0fb56 --- /dev/null +++ b/cpp/Cocktail Sort.cpp @@ -0,0 +1,72 @@ +// C++ implementation of Cocktail Sort +#include +using namespace std; + +// Sorts array a[0..n-1] using Cocktail sort +void CocktailSort(int a[], int n) +{ + bool swapped = true; + int start = 0; + int end = n - 1; + + while (swapped) { + // reset the swapped flag on entering + // the loop, because it might be true from + // a previous iteration. + swapped = false; + + // loop from left to right same as + // the bubble sort + for (int i = start; i < end; ++i) { + if (a[i] > a[i + 1]) { + swap(a[i], a[i + 1]); + swapped = true; + } + } + + // if nothing moved, then array is sorted. + if (!swapped) + break; + + // otherwise, reset the swapped flag so that it + // can be used in the next stage + swapped = false; + + // move the end point back by one, because + // item at the end is in its rightful spot + --end; + + // from right to left, doing the + // same comparison as in the previous stage + for (int i = end - 1; i >= start; --i) { + if (a[i] > a[i + 1]) { + swap(a[i], a[i + 1]); + swapped = true; + } + } + + // increase the starting point, because + // the last stage would have moved the next + // smallest number to its rightful spot. + ++start; + } +} + +/* Prints the array */ +void printArray(int a[], int n) +{ + for (int i = 0; i < n; i++) + printf("%d ", a[i]); + printf("\n"); +} + +// Driver code +int main() +{ + int a[] = { 5, 1, 4, 2, 8, 0, 2 }; + int n = sizeof(a) / sizeof(a[0]); + CocktailSort(a, n); + printf("Sorted array :\n"); + printArray(a, n); + return 0; +}