# A sorting algorithm that slightly improves on selection sort?

CServer Side ProgrammingProgramming

Here we will see some improvements on selection sort. As we know that the selection sort works by taking either the minimum or maximum element from the array and place that element at correct position. In this approach, we want to sort the array in both ways. Here we will take the max and min simultaneously, then sort the array from two end. Let us see the algorithm to get better idea.

## Algorithm

#### twoWaySelectionSort(arr, n)

begin
for i := 0, and j := n-1, increase i by 1, and decrease j by 1, until i>=j, do
min := minimum element from index i to j
max := maximum element from index i to j
i_min := index of min
i_max := index of max
exchange the arr[i] and arr[i_min]
if arr[i_min] is same as max, then
swap arr[j] and arr[i_min]
else
swap arr[j] and arr[i_max]
end if
done
end

## Example

Live Demo

#include<iostream>
using namespace std;
void twoWaySelectionSort(int arr[], int n) {
//i will move from left, and j will move from right
for (int i = 0, j = n - 1; i < j; i++, j--) {
int min = arr[i], max = arr[i];
int i_min = i, i_max = i; //i_min and i_max will hold min and max index respectively
for (int k = i; k <= j; k++) {
if (arr[k] > max) {
max = arr[k];
i_max = k;
} else if (arr[k] < min) {
min = arr[k];
i_min = k;
}
}
swap(arr[i], arr[i_min]); //put the min into the index i
if (arr[i_min] == max)
swap(arr[j], arr[i_min]);
else
swap(arr[j], arr[i_max]);
}
}
main() {
int arr[] = { 25, 45, 14, 10, 23, 29, 65, 21, 78, 96, 30 };
int n = sizeof(arr) / sizeof(arr);
twoWaySelectionSort(arr, n);
cout << "Sorted array: ";
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
}

## Output

Sorted array: 10 14 21 23 25 29 30 45 65 78 96