using System.Collections.Generic;
using System.Threading.Tasks;
public static class MultiThreadedDoubleEndedSelectionSort
private static object lockObj = new object();
public static void Sort<T>(IList<T> arr) where T: IComparable<T>
int numThreads = Environment.ProcessorCount;
Task[] tasks = new Task[numThreads];
for (int i = 0; i < numThreads; i++)
int startIndex = i * (arr.Count / numThreads);
int endIndex = (i == numThreads - 1) ? arr.Count - 1 : ((i + 1) * (arr.Count / numThreads)) - 1;
tasks[i] = Task.Run(() => SortSegment(arr, startIndex, endIndex));
for (int i = 1; i < arr.Count; i++)
while (j >= 0 && arr[j].CompareTo(key) > 0)
private static void SortSegment<T>(IList<T> arr, int left, int right) where T: IComparable<T>
for (int i = left; i <= right; i++)
if (arr[i].CompareTo(arr[minIndex]) < 0)
else if (arr[i].CompareTo(arr[maxIndex]) > 0)
if (minIndex != maxIndex)
Swap(arr, left, minIndex);
Swap(arr, right, maxIndex);
private static void Swap<T>(IList<T> arr, int i, int j)
public static void Main(string[] args)
IList<int> arr = new[] { 64, 25, 12, 22, 11, 1, 23, 13, 60 };
Console.WriteLine("Original array:");
Console.WriteLine("\nSorted array:");
private static void PrintArray<T>(IEnumerable<T> arr)
Console.Write(num + " ");