How it works
Selects both the minimum and maximum in each pass, placing them at the beginning and end respectively. Approximately 2x fewer passes than standard selection sort.
Implementation
function doubleSelectionSort(arr) { let left = 0, right = arr.length - 1; while (left < right) { let min = left, max = left; for (let i = left; i <= right; i++) { if (arr[i] < arr[min]) min = i; if (arr[i] > arr[max]) max = i; } [arr[left], arr[min]] = [arr[min], arr[left]]; if (max === left) max = min; [arr[right], arr[max]] = [arr[max], arr[right]]; left++; right--; } }
def double_selection_sort(arr): left, right = 0, len(arr) - 1 while left < right: mi, ma = left, left for i in range(left, right + 1): if arr[i] < arr[mi]: mi = i if arr[i] > arr[ma]: ma = i arr[left], arr[mi] = arr[mi], arr[left] if ma == left: ma = mi arr[right], arr[ma] = arr[ma], arr[right] left += 1; right -= 1
void doubleSelectionSort(vector<int>& arr) { int left = 0, right = arr.size() - 1; while (left < right) { int mi = left, ma = left; for (int i = left; i <= right; i++) { if (arr[i] < arr[mi]) mi = i; if (arr[i] > arr[ma]) ma = i; } swap(arr[left], arr[mi]); if (ma == left) ma = mi; swap(arr[right], arr[ma]); left++; right--; } }
void DoubleSelectionSort(int[] arr) { int left = 0, right = arr.Length - 1; while (left < right) { int min = left, max = left; for (int i = left; i <= right; i++) { if (arr[i] < arr[min]) min = i; if (arr[i] > arr[max]) max = i; } (arr[left], arr[min]) = (arr[min], arr[left]); if (max == left) max = min; (arr[right], arr[max]) = (arr[max], arr[right]); left++; right--; } }
void doubleSelectionSort(int arr[], int n) { int left = 0, right = n - 1; while (left < right) { int mi = left, ma = left; for (int i = left; i <= right; i++) { if (arr[i] < arr[mi]) mi = i; if (arr[i] > arr[ma]) ma = i; } int t = arr[left]; arr[left] = arr[mi]; arr[mi] = t; if (ma == left) ma = mi; t = arr[right]; arr[right] = arr[ma]; arr[ma] = t; left++; right--; } }