Написать модуль сортировки - C#
Формулировка задачи:
Написать модуль сортировки, включающий в себя:
1. Метод, реализующий упорядочивание массива произвольного типа. Принцип сравнения
двух элементов должен передаваться в метод через делегат. Стандартные инструменты типа
Array.Sort и IComparable не использовать
2. Метод, позволяющий запустить в сортировку в отдельном потоке выполнения;
3. Событие, сигнализирующее о завершении сортировки.
Продемонстрировать работу модуля в многопоточном режиме.
Создал такой класс который содержит метод сортировки и метод, запускающий в новом потоке.
Помогите с написанием 3 пункта.
Начал писать. Вот что набросал.
public delegate bool SortingMethod<T>(T x1, T x2);
class SortingUnit<T>
{
public event EventHandler<SortingEventArgs<T>> SortingFinished;
public void CustomSort (T[] arr, SortingMethod<T> sortingMethod)
{
bool isSorted = false;
T temp;
while (!isSorted)
{
isSorted = true;
for (int i = arr.GetLowerBound(0); i < arr.GetUpperBound(0); i++)
{
if (sortingMethod(arr[i], arr[i + 1]))
{
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
isSorted = false;
}
}
}
SortingFinished?.Invoke(this, new SortingEventArgs<T>(arr));
}
public void RunSortInNewThread(T[] arr, SortingMethod<T> sortingMethod)
{
ThreadStart thStart = new ThreadStart( () => CustomSort(arr, sortingMethod) );
Thread th = new Thread(thStart);
th.Start();
}
}
значение я возвращаю в eventargs вот такой класс
class SortingEventArgs<T> : EventArgs
{
public T[] SortedArray { get; }
public SortingEventArgs(T[] sortedArray)
{
if (sortedArray!=null)
{
this.SortedArray = sortedArray;
}
else
{
throw new ArgumentException("SortedArray can't be null");
}
}
}Решение задачи: «Написать модуль сортировки»
textual
Листинг программы
public class SortingModule<T>
{
public event EventHandler SortingFinished;
public void Sort(T[] arr, Func<T, T, int> compare)
{
if (compare == null)
{
throw new ArgumentNullException();
}
for (int i = 0; i < arr.Length; i++)
{
for (int j = i + 1; j < arr.Length; j++)
{
if (compare(arr[j], arr[i]) > 0)
{
var tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
}
}
SortingFinished?.Invoke(this, EventArgs.Empty);
}
public void CreateThreadForSorting(T[] arr, Func<T, T, int> compare)
{
Thread th = new Thread(() => this.Sort(arr, compare));
th.Start();
}
}