Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Оцінка складності алгоритму . 21




У i-му проході обробляється підмасив А[0]-A[i] і вимагає в середньому i/2 порівнянь. Загальне число порівнянь становить

1/2 + 2/2 + 3/2 + ... + (N-2) / 2 + (n-l) / 2 = n (n-l) / 4

 

// Впорядкування n-елементного масиву типу Т,

// представлення алгоритму сортування методом гібридного вибору

template<classT>

void SelectionSort(T A[], int n)

{

// індекс найменшого елемента на кожному проході

int smalllndex;

int i, j;

for (i=0; i<n-l; i++)

{

// почати прохід з індексу i; встановити smalllndex в i

smalllndex =i;

for (j=i+l; j<n; j++)

// оновити smalllndex, якщо знайдений менший елемент

if (Alj] < A[smalllndex])

smalllndex = j;

//по закінченні помістити найменший елемент в A [i] 22

Swap(A[i], A[smalllndex]);

}

}

// Представлення алгоритму сортування методом бульбашки.

// BubbleSort приймає масив А і його розмір – n.

// Сортування виконується за допомогою низки проходів, поки lastExchangelndex = 0.

template<classT>

void BubbleSort (T А[], int n)

{

int i, j;

// Індекс останнього елемента, що брав участь в обміні

int lastExchangelndex;

// i - Індекс останнього елемента в підсписку i = п-1;

// продовжувати процес, поки не буде зроблено жодного обміну

while (і > 0)

{

// Початкове значення lastExchangelndex lastExchangelndex = 0;

// Сканувати підсписок A [0] - A [i]

for (j=0; j < i; j++)

// змінити місця сусідніх елеменів і оновити lastExchangelndex 23

If(A[j+l] < A[j])

{

Swap(A[j], A[j+1]);

lastExchangelndex = j;

}

//присвоїти i значення індексу останнього обміну, продовжити сортування

i = lastExchangelndex;

}

}

 

// Сортування вставками впорядковує підсписки A [0] ... A [i],

// 1 <= i <= n-1. Для кожного i A [i] вставляється в підходящу

// позиціюА [j]

template<class T>

void InsertionSort(T A[], int n)

{

int i, j;

T temp;

// і визначає підсписок А [0] ... A [i]

for (i=l; i<n; i++) 24

{

// Індекс j пробігає вниз за списком від A [i] в процесі

// пошуку правильної позиції вставленого значення j = i;

temp = A[i] ;

//виявити відповідну позицію для вставки, скануючи подспісок,

// поки temp <A [j-1] або поки не дістанеться початок списку

while (j> 0 && temp<A[j-1])

{

// зсунути елементи вправо, щоб звільнити місце для вставки

A[j] = A[j-1];

j--;

}

// точка вставки знайдена; вставити temp

A[j] = temp;

}

}

Порівняння часу сортування за методами

  Сортування вибором зліва Сортування вибором Бульбашкове сортування Сортування вставками
n=4000 12.23 17.30 15.78 5.67
n=8000 49.95 29.43 64.03 23.15
n=10000 77.47 46.02 99.10 35.43
n=15000 173.97 103.00 223.28 80.23
n=20000 313.33 185.05 399.47 143.67

 

А = 800, 150, 300, 600, 550, 650, 400, 350, 450, 700 20

 

A [mid] = 550, Індекси - зміні scanUp = 0, scanDown = 9.

 

 

 

 

 

 

Оцінка складності алгоритму швидкого сортування О(n log2n)

При першому скануванні проводиться n-1 порівнянь. В результатістворюються два підсписки розміром n / 2. На наступній фазі обробка кожного підсписку вимагає приблизно n / 2 порівнянь. Загальне число порівнянь на ційфазі дорівнює 2 (n / 2) = n. На наступній фазі обробляються чотири підсписки, що вимагає 4 (n / 4) порівнянь, і т.д. Зрештою процес розбиття припиняється після к проходів, коли підсписки містять поодному елементу. Загальне число порівнянь приблизно однакове

n + 2(n/2) + 4(n/4) + ... + n(n/n) = n + n+... + n = n*k = n* log2n

// Quicksort приймає у якості параметрів масив 22

// та граничні значення його індексів

template <class T>

void Quicksort(T A[], int low, int high)

{

// локальні змінні, що містять індекс середини mid,

// центральний елементтаіндекси сканування

t pivot;

int scanUp, scanDown;

int mid;

// якщо діапазон індексів не включає в себе як мінімум два елементи, повернутися

if (high - low <= 0)

return;

else

/ / Якщо в підсписку два елементи, порівняти їх між собою

/ / І поміняти місцями при необхідності

if (high - low == 1)

{

if (A[high] < A[low])

Swap(A[low], Afhigh]);

return; 23

}

/ / Отримати індекс середини і присвоїти визначене їм значення

/ / Центральному значеннює

mid = (low + high)/2;

pivot = A[mid];

/ / Поміняти місцями центральний і початковий елементи списку

/ / І ініціалізувати індекси scanUp і scanDown

Swap (A[mid], A[low]);

scanUp = low + 1;

scanDown = high;

/ / Шукати елементи, розташовані не в тих підсписках.

/ / Зупинитися при scanDown <scanUp

do

{

/ / Просуватися вгору по нижньому підсписку; зупинитися,

/ / Коли scanUp вкаже на верхній підсписок або якщо

/ / Вказуваний цим індексом елемент> центрального

while (scanUp <= scanDown && A[scanUp] <= pivot)

scanUp++;

/ / Просуватися вниз по верхньому підсписку; зупинитися,

/ / Якщо scanDown вкаже елемент <= центрального. 24

/ / Зупинка на елементі A [low] гарантується

while (pivot < A[scanDown])

scanDown--;

/ / Якщо індекси все ще у своїх підсписках, то вони вказують

/ / Два елементи, що знаходяться не в тих підсписках.

/ / Поміняти їх місцямиif (scanUp < scanDown)

{

Swap (AfscanUp], AEscanDown]);

}

}

while (scanUp < scanDown);

/ / Копіювати центральний елемент в точку розбиття

A[low] = A[scanDown];

A[scanDown] = pivot;

/ / Якщо нижній підсписок (low. .. scanDown-1) має 2 або більше

/ / елементів, виконати рекурсивний виклик

if (low < scanDown-1)

Quicksort(A, low, scanDown-1);

// якщо верхній підсписок (scanDown+1...high) має 2 або більше елементів

// виконати рекурсивний виклик 25

if (scanDown+1 < high)

Quicksort(A, scanDown+1, high);

 

 


Поделиться:

Дата добавления: 2015-04-04; просмотров: 149; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.009 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты