How it works
A variant of bubble sort that traverses the list in both directions alternately. Helps avoid the "turtle" problem (small values at the end).
Implementation
function cocktailSort(arr, stats) { const n = arr.length; let start = 0, end = n - 1, swapped = true; while (swapped) { swapped = false; for (let i = start; i < end; i++) { compare(i, i + 1); if (arr[i] > arr[i + 1]) { [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]]; swap(i, i + 1); swapped = true; } } end--; if (!swapped) break; swapped = false; for (let i = end; i > start; i--) { compare(i, i - 1); if (arr[i] < arr[i - 1]) { [arr[i], arr[i - 1]] = [arr[i - 1], arr[i]]; swap(i, i - 1); swapped = true; } } start++; checkpoint(start, Math.ceil(n / 2)); } for (let i = 0; i < n; i++) markSorted(i); }
def cocktailSort(arr, stats): start = 0 end = (n - 1) swapped = True while swapped: swapped = False for i in range(start, end): compare(i, (i + 1)) if (arr[i] > arr[(i + 1)]): arr[i], arr[(i + 1)] = arr[(i + 1)], arr[i] swap(i, (i + 1)) swapped = True end -= 1 if not swapped: break swapped = False for i in range(end, start, -1): compare(i, (i - 1)) if (arr[i] < arr[(i - 1)]): arr[i], arr[(i - 1)] = arr[(i - 1)], arr[i] swap(i, (i - 1)) swapped = True start += 1 checkpoint(start, -(-(n // 2) // 1)) for i in range(n): markSorted(i)
#include <vector> #include <algorithm> #include <cmath> void sort(std::vector<int>& arr, int n, int& comparisons, int& swaps) { int start = 0; int end = (n - 1); int swapped = 1; while(swapped) { swapped = 0; for(int i=start; i<end; i++) { compare(i, (i + 1)); if((arr[i] > arr[(i + 1)])) { std::swap(arr[i], arr[(i + 1)]); swap(i, (i + 1)); swapped = 1; } } end--; if(!swapped) { break; } swapped = 0; for(int i=end; i>start; i--) { compare(i, (i - 1)); if((arr[i] < arr[(i - 1)])) { std::swap(arr[i], arr[(i - 1)]); swap(i, (i - 1)); swapped = 1; } } start++; checkpoint(start, (int)std::ceil((n / 2))); } for(int i=0; i<n; i++) { markSorted(i); } }
public void Sort(int[] arr, int n, dynamic stats) { int start = 0; int end = (n - 1); int swapped = true; while(swapped) { swapped = false; for(int i=start; i<end; i++) { compare(i, (i + 1)); if((arr[i] > arr[(i + 1)])) { { int _t = arr[i]; arr[i] = arr[(i + 1)]; arr[(i + 1)] = _t; } swap(i, (i + 1)); swapped = true; } } end--; if(!swapped) { break; } swapped = false; for(int i=end; i>start; i--) { compare(i, (i - 1)); if((arr[i] < arr[(i - 1)])) { { int _t = arr[i]; arr[i] = arr[(i - 1)]; arr[(i - 1)] = _t; } swap(i, (i - 1)); swapped = true; } } start++; checkpoint(start, (int)Math.Ceiling((n / 2))); } for(int i=0; i<n; i++) { markSorted(i); } }
#include <stdio.h> #include <math.h> void sort(int arr[], int n, int* comparisons, int* swaps) { int start = 0; int end = (n - 1); int swapped = 1; while(swapped) { swapped = 0; for(int i=start; i<end; i++) { compare(i, (i + 1)); if((arr[i] > arr[(i + 1)])) { { int _t = arr[i]; arr[i] = arr[(i + 1)]; arr[(i + 1)] = _t; } swap(i, (i + 1)); swapped = 1; } } end--; if(!swapped) { break; } swapped = 0; for(int i=end; i>start; i--) { compare(i, (i - 1)); if((arr[i] < arr[(i - 1)])) { { int _t = arr[i]; arr[i] = arr[(i - 1)]; arr[(i - 1)] = _t; } swap(i, (i - 1)); swapped = 1; } } start++; checkpoint(start, (int)ceil((n / 2))); } for(int i=0; i<n; i++) { markSorted(i); } }