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) { let start = 0, end = arr.length - 1, swapped = true; while (swapped) { swapped = false; for (let i = start; i < end; i++) { if (arr[i] > arr[i+1]) { [arr[i], arr[i+1]] = [arr[i+1], arr[i]]; swapped = true; } } end--; for (let i = end; i > start; i--) { if (arr[i] < arr[i-1]) { [arr[i], arr[i-1]] = [arr[i-1], arr[i]]; swapped = true; } } start++; } }
def cocktail_sort(arr): start, end = 0, len(arr) - 1 swapped = True while swapped: swapped = False for i in range(start, end): if arr[i] > arr[i+1]: arr[i], arr[i+1] = arr[i+1], arr[i] swapped = True end -= 1 for i in range(end, start, -1): if arr[i] < arr[i-1]: arr[i], arr[i-1] = arr[i-1], arr[i] swapped = True start += 1
void cocktailSort(vector<int>& arr) { int start = 0, end = arr.size() - 1; bool swapped = true; while (swapped) { swapped = false; for (int i = start; i < end; i++) if (arr[i] > arr[i+1]) { swap(arr[i], arr[i+1]); swapped = true; } end--; for (int i = end; i > start; i--) if (arr[i] < arr[i-1]) { swap(arr[i], arr[i-1]); swapped = true; } start++; } }
void CocktailSort(int[] arr) { int start = 0, end = arr.Length - 1; bool swapped = true; while (swapped) { swapped = false; for (int i = start; i < end; i++) if (arr[i] > arr[i+1]) { (arr[i], arr[i+1]) = (arr[i+1], arr[i]); swapped = true; } end--; for (int i = end; i > start; i--) if (arr[i] < arr[i-1]) { (arr[i], arr[i-1]) = (arr[i-1], arr[i]); swapped = true; } start++; } }
void cocktailSort(int arr[], int n) { int start = 0, end = n - 1, swapped = 1; while (swapped) { swapped = 0; for (int i = start; i < end; i++) if (arr[i] > arr[i+1]) { int t = arr[i]; arr[i] = arr[i+1]; arr[i+1] = t; swapped = 1; } end--; for (int i = end; i > start; i--) if (arr[i] < arr[i-1]) { int t = arr[i]; arr[i] = arr[i-1]; arr[i-1] = t; swapped = 1; } start++; } }