Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c#_theoretical_1.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1.07 Mб
Скачать

Узагальнені методи

Неузагальнений клас може містити окремі узагальнені методи. Узагальнені методи визначаються в такий спосіб:

тип_функції ім'я_функції <список_узагальнених_типів> (список_параметрів) [обмеження]

{

...

}

Тут тип_функції − тип значення, що повертається, у якості якого може бути зазначений як конкретний тип даних, так і один із типів параметрів зі списку узагальнених типів; список_параметрів − список формальних параметрів узагальненої функції, які можуть бути описані як із зазначенням конкретного типу даних, так і одного із типів зі списку узагальнених типів.

Наприклад, визначимо клас, що містить різні методи сортування масивів. Для того щоб можна було використати ці методи для сортування масивів із різними типами елементів, методи сортування можна зробити узагальненими.

У прикладі реалізуємо алгоритм швидкого сортування. Алгоритм швидкого сортування базується на парадигмі «розділяй і пануй». Нижче описаний процес сортування частини масиву А [р..r], який зводиться до двох основних кроків.

Крок 1 (Розбиття). Масив А [р..r] розбивається (шляхом переупорядкування його елементів) на два (можливо, порожніх) підмасиви A[p..q-1] і A [q+l..r]. Кожен елемент підмасива A[p..q-1] не перевищує елемент A[q], а кожний елемент підмасива A[q+l..r] не менший за елемент A[q]. Індекс q обчислюється в ході процедури розбиття.

Крок 2 (Підкорення частин). Підмасиви A[p..q-1] та A[q+l..r] сортуються шляхом рекурсивного виклику процедури швидкого сортування.

Псевдокод алгоритму швидкого сортування реалізується представленою нижче процедурою:

QuickSort(A, р, r)

1: if p<r

then 1 q := Partition(A, p, r)

2 QuickSort(A, p, q-1)

3 QuickSort(A, q+1, r)

Для того, щоб виконати сортування всього масиву А, потрібно викликати описану процедуру у наступному виді QuickSort(A, 1, Length[A]).

Ключовою частиною розглянутого алгоритму сортування є процедура Partition, що змінює порядок елементів підмасива А[р..r] без залучення додаткової пам’яті:

Partition(A, p, r)

1: х := А[r]

2: i := р-1

3: for j := p to r-1 do

4: if A[j]<=x

then 1: i := i+1

2: Обміняти А[i] та A[j]

5: Обміняти А[i +1] та А[r]

6: return i+1

Нижче наведено приклад роботи процедури Partition з 6-елементним масивом. Ця процедура завжди вибирає елемент х=А[r] у якості опорного (pivot) елемента. Розбиття підмасиву А[р..r] буде виконуватися відносно цього елемента.

i

p,j

r

a)

2

5

6

1

3

4

p,i

j

r

б)

2

5

6

1

3

4

p,i

j

r

в)

2

5

6

1

3

4

p,i

j

r

г)

2

5

6

1

3

4

p

i

j

r

д)

2

1

6

5

3

4

p

i

r

е)

2

1

3

5

6

4

p

i

q

r

є)

2

1

3

4

6

5

Програмна реалізація даного алгоритму на мові C# у вигляді узагальненого статичного методу класу Sorter може бути наступною:

сlass Sorter

{

public static void QuickSort<T>(T[] array, int p, int r) where T : IComparable

{

if (p < r)

{

//розбиття масиву

T x = array[r];

T tmp;

int i = p - 1;

for(int j=p; j<r; j++)

if (!(array[j].CompareTo(x)>0))

{

i++;

tmp = array[i];

array[i] = array[j];

array[j] = tmp;

}

tmp = array[i+1];

array[i+1] = array[r];

array[r] = tmp;

//підкорення частин

QuickSort<T>(array, p, i);

QuickSort<T>(array, i+2, r);

}

}

//iншi методи сортування

...

}

Виклик узагальненого методу класу здійснюється із вказанням конкретного типу елементів масиву. Наприклад:

int[] a = { 2, 5, 6, 1, 3, 4 };

Sorter.QuickSort<int>(a,0,a.Length-1);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]