Практикум по курсу "Объектно-ориентированное программирование" на языке C#. Андрианова А.А - 22 стр.

UptoLike

21
Определим обобщенный метод быстрой сортировки, указав
ограничение на использование в качестве обобщенных типов только тех,
которые раскрывают интерфейс IComparable. Пусть этот метод является
статическим для главного класса приложения Program.
class Program
{
static void QuickSort<T>(T [] m, int l, int r)
where T: IComparable
{
if(l == r)
return;
int i = l, j = r;
// выбирается элемент, делящий массив на две части
T selected = m[l];
// осуществляется поиск и перестановка элементов, меньших
// выбранного, с конца массива и больших выбранного
// с начала массива.
while(i != j)
{
while(m[j].CompareTo(selected) >= 0 && j > i)
j--;
if(j > i)
{
m[i] = m[j];
while(m[i].CompareTo(selected) <= 0 && i < j)
i++;
m[j] = m[i];
}
}
// выбранный элемент устанавливается на надлежащее место
m[i] = selected;
// если существуют элементы слева от выбранного,
// сортируем эту часть массива
if(l <= i-1)
QuickSort(m, l, i-1);
// то же проводится с правой частью массива,
// если она существует
if( i+1 < r)
QuickSort(m , i+1, r);
}
static void Main(string[] args)
{
Fraction[] a = { new Fraction(4,2,3,1),
new Fraction(1,6,5,-1),
new Fraction(0,2,7,1),
new Fraction(10,2,3,-1),
new Fraction(2,13,20,1),
     Определим обобщенный метод быстрой сортировки, указав
ограничение на использование в качестве обобщенных типов только тех,
которые раскрывают интерфейс IComparable. Пусть этот метод является
статическим для главного класса приложения Program.

     class Program
     {
        static void QuickSort(T [] m, int l, int r)
                                        where T: IComparable
        {
            if(l == r)
               return;
            int i = l, j = r;
            // выбирается элемент, делящий массив на две части
            T selected = m[l];
            // осуществляется поиск и перестановка элементов, меньших
           // выбранного, с конца массива и больших выбранного
          // с начала массива.
          while(i != j)
          {
              while(m[j].CompareTo(selected) >= 0 && j > i)
                j--;
              if(j > i)
              {
                 m[i] = m[j];
                 while(m[i].CompareTo(selected) <= 0 && i < j)
                     i++;
                 m[j] = m[i];
              }
          }
          // выбранный элемент устанавливается на надлежащее место
          m[i] = selected;
          // если существуют элементы слева от выбранного,
          // сортируем эту часть массива
          if(l <= i-1)
              QuickSort(m, l, i-1);
          // то же проводится с правой частью массива,
          // если она существует
          if( i+1 < r)
              QuickSort(m , i+1, r);
     }

     static void Main(string[] args)
     {
        Fraction[] a = { new Fraction(4,2,3,1),
                        new Fraction(1,6,5,-1),
                        new Fraction(0,2,7,1),
                        new Fraction(10,2,3,-1),
                        new Fraction(2,13,20,1),

21