- •Тема 1 Програмна технологія Microsoft .Net. Вступ
- •Загальна характеристика платформи .Net Framework
- •Єдине середовище виконання clr
- •Єдина система типів cts
- •Бібліотека базових типів bcl
- •Розбір найпростішої програми на мові с
- •Загальна структура програми на мові c#
- •Створення .Net-додатків з використанням csc.Exe
- •Створення .Net-додатків на мові c# з використанням ide Visual с# 2010 Express
- •Тема 2 Класи в c# Вступ
- •Синтаксис опису класу
- •Поля класу
- •Методи класу
- •Властивості та індексатори
- •Конструктори
- •Деструктор
- •Перевантаження операцій
- •Частинні випадки класу
- •Структура «Раціональне число»
- •Тема 3 Основні засоби розробки класів у c# Вступ
- •Успадкування
- •Поліморфне успадкування
- •Агрегація та композиція
- •Абстрактні класи
- •Інтерфейси
- •Тема 4 Узагальнення Поняття узагальнених класів
- •Обмеження (constraints) для параметрів типу
- •Узагальнені методи
- •Узагальнені інтерфейси
- •Недолік обмеження операцій
Узагальнені методи
Неузагальнений клас може містити окремі узагальнені методи. Узагальнені методи визначаються в такий спосіб:
тип_функції ім'я_функції <список_узагальнених_типів> (список_параметрів) [обмеження] { ... } |
Тут тип_функції − тип значення, що повертається, у якості якого може бути зазначений як конкретний тип даних, так і один із типів параметрів зі списку узагальнених типів; список_параметрів − список формальних параметрів узагальненої функції, які можуть бути описані як із зазначенням конкретного типу даних, так і одного із типів зі списку узагальнених типів.
Наприклад, визначимо клас, що містить різні методи сортування масивів. Для того щоб можна було використати ці методи для сортування масивів із різними типами елементів, методи сортування можна зробити узагальненими.
У прикладі реалізуємо алгоритм швидкого сортування. Алгоритм швидкого сортування базується на парадигмі «розділяй і пануй». Нижче описаний процес сортування частини масиву А [р..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] буде виконуватися відносно цього елемента.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Програмна реалізація даного алгоритму на мові 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); |
