Проблема здесь не в передаче по ссылке, а в этой строке, как вы определили:
a = a.OrderBy(x => r.Next()).ToArray();
Вы даете a
новое значение, которое отличается от простого изменения содержимого a
. Поскольку метод Sort
сортирует массив на месте, вам не нужно создавать новый массив, и массив не нужно перетасовывать перед его сортировкой.
Итак, удаление этих двух строк должно заставить ваш код работать:
Random r = new Random();
a = a.OrderBy(x => r.Next()).ToArray();
Кажется, вы столкнулись с некоторыми проблемами при попытке вернуть массив из Sort
. Вы можете исправить это, сделав все ваши методы общими, с общим параметром T
, ограниченным IComparable<T>
:
public static T[] Sort<T>(T[] a) where T: IComparable<T>
{
Random r = new Random();
a = a.OrderBy(x => r.Next()).ToArray();
Sort(a, 0, a.Length - 1);
return a;
}
private static void Sort<T>(T[] a, int lo, int hi) where T: IComparable<T>
{
if (lo >= hi) return;
int p = Partition(a, lo, hi);
Sort(a, lo, p - 1);
Sort(a, p + 1, hi);
}
private static int Partition<T>(T[] a, int lo, int hi) where T: IComparable<T>
{
int i = lo, j = hi;
T p = a[lo];
while (true)
{
while (Less(a[++i], p))
{
if (i == hi)
break;
}
while (Less(p, a[--j]))
{
if (j == lo)
break;
}
if (i >= j) break;
Exch(a, i, j);
}
Exch(a, lo, j);
return j;
}
private static void Exch<T>(T[] a, int lo, int hi)
{
T tmp = a[lo];
a[lo] = a[hi];
a[hi] = tmp;
}
private static bool Less<T>(T a, T b) where T: IComparable<T>
{
return a.CompareTo(b) < 0;
}