Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

О.О.П / ооп / 13. Об'єктно-орієнтоване програмування, л.3

.2.ppt
Скачиваний:
0
Добавлен:
30.05.2020
Размер:
813.57 Кб
Скачать

Програмування на мові Сі++

Масиви

2

Сортировка

Сортировка – это расстановка элементов массива в заданном порядке (по возрастанию, убыванию, последней цифре, сумме делителей, …).

Задача: переставить элементы массива в порядке

возрастания.

сложность O(N2)

Алгоритмы:

 

простые и понятные, но неэффективные для больших массивов

 

метод пузырька

сложность

 

метод выбора

O(logN)

 

сложные, но эффективные

время

O(N2)

 

 

 

 

«быстрая сортировка» (Quick Sort)

O(logN)

 

 

сортировка «кучей» (Heap Sort)

 

 

 

сортировка слиянием

 

 

 

 

пирамидальная сортировка

 

N

 

 

 

 

3

Метод пузырька

Идея – пузырек воздуха в стакане воды поднимается со дна вверх.

Для массивов – самый маленький («легкий») элемент перемещается вверх («всплывает»).

1-ый проход

 

 

 

• начиная снизу, сравниваем два

 

 

 

 

5

5

5

1

соседних элемента; если они стоят

2

2

1

5

«неправильно», меняем их местами

 

 

1

1

2

2

• за 1 проход по массиву один

3

3

3

3

элемент (самый маленький)

становится на свое место

 

 

 

 

2-ой проход

 

 

3-ий проход

 

1

1

1

1

1

Для сортировки массива

5

5

2

2

2

из N элементов нужен

2

2

5

5

3

N-1 проход (достаточно

поставить на свои места

 

 

 

 

5

3

3

3

3

N-1 элементов).

4

Программа (1-ый проход)

0

1 … N-2

N-1

5

2

6

3

сравниваются пары

 

A[N-2] и A[N-1],

 

A[N-3] и A[N-2]

 

A[j] и A[j+1]

 

A[0] и A[1]

 

for( j = N-2; j >=

0 ; j-- )

if ( A[j] > A[j+1] ) { c = A[j];

A[j] = A[j+1]; A[j+1] = c;

}

5

Программа (следующие проходы)

2-ой проход

0

1

1

5

N-2

3

N-1

6

! A[0] уже на своем месте!

for ( j = N-2; j >= 1 ; j-- ) if ( A[j] > A[j+1] ) {

c = A[j];

A[j] = A[j+1]; A[j+1] = c;

}

(i+1)-ый проход

for ( j = N-2; j >= i ; j-- )

...

Программа

6

 

 

 

 

 

 

 

 

 

 

 

 

main()

?

 

 

 

 

 

Почему цикл для i < N-1,

 

 

{

 

 

 

const int N = 10;

 

а не i < N?

 

 

int A[N], i, j, c;

 

 

 

 

 

// заполнить массив

элементы выше

 

// вывести исходный

 

A[i] уже

 

for (i = 0; i < N-1; i

 

поставлены

 

for (j = N-2; j >= i; j --)

 

 

 

 

if ( A[j] > A[j+1] ) {

 

 

 

 

с = A[j];

меняем

 

 

 

 

 

A[j] = A[j+1];

 

 

 

 

A[j] и

 

 

 

 

 

A[j+1] = с;

 

 

 

 

A[j+1]

 

 

 

 

 

}

 

 

 

 

}

 

 

 

 

 

 

 

// вывести полученный массив

 

}

 

 

 

 

 

 

 

7

Метод пузырька с флажком

Идея – если при выполнении метода пузырька не было обменов, массив уже отсортирован и остальные проходы не нужны.

Реализация: переменная-флаг, показывающая, был ли обмен; если она равна 0, то выход.

do {

int flag;

flag = 0;

// сбросить флаг

2

1

4

3

1

2

3 4

for (j = N-2; j >= 0; j --) if ( A[j] > A[j+1] ) {

с = A[j]; A[j] = A[j+1]; A[j+1] = с;

? Как улучшить?

flag = 1; // поднять флаг

}

}

while ( flag ); // выход при flag = 0

8

Метод пузырька с флажком

i = 0; do {

flag = 0; // сбросить флаг

for ( j = N-2; j >= i ; j -- ) if ( A[j] > A[j+1] ) {

с = A[j];

A[j] = A[j+1]; A[j+1] = с;

flag = 1; // поднять флаг

}

i ++;

}

while ( flag ); // выход при flag = 0

9

Метод выбора

Идея:

найти минимальный элемент и поставить на первое место (поменять местами с A[0])

из оставшихся найти минимальный элемент и поставить на второе место (поменять местами с

A[1]), и т.д.

4

1

1

1

3

3

2

2

1

4

4

3

2

2

3

4

Метод выбора

 

 

 

10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

нужно N-1

 

 

 

 

 

 

 

 

проходов

 

 

 

 

for( i = 0; i <

N-1 ; i ++ )

поиск

 

 

 

 

 

 

 

 

 

 

 

nMin = i;

 

 

 

минимального от

 

 

 

 

A[i] до A[N-1]

 

for ( j = i+1

 

 

 

 

j < N; j ++)

 

 

 

 

 

if( A[j] < A[nMin] ) nMin = j;

 

 

 

 

 

if( nMin != i ) {

 

 

 

 

 

 

 

 

c = A[i];

 

 

если

нужно,

 

 

 

 

 

A[i] = A[nMin];

переставляем

 

 

 

 

 

 

 

 

 

 

 

 

 

A[nMin] = c;

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

}

 

?

 

 

 

 

 

 

 

Можно ли убрать if?