Програмування на мові Сі++
Масиви
2
Сортировка
Сортировка – это расстановка элементов массива в заданном порядке (по возрастанию, убыванию, последней цифре, сумме делителей, …).
Задача: переставить элементы массива в порядке
возрастания. |
сложность O(N2) |
|
Алгоритмы: |
||
|
•простые и понятные, но неэффективные для больших массивов
|
метод пузырька |
сложность |
|
метод выбора |
O(N·logN) |
|
• |
сложные, но эффективные |
время |
O(N2) |
|
|
|
|||
|
|
«быстрая сортировка» (Quick Sort) |
O(N·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? |
|
|
||||||
|
|
|
|