Анализ комбинаторных
алгоритмов
Лекция №2
Сортировки, поиск и
порядковые статистики
Сортировка. Общие понятия
 Задача сортировки получает на входе
последовательность и в
результате выдает перестановку ,
такую что
 Обычно сортируются не отдельные числа, а
целые записи. При этом поле, по которому
производится сортировка, называется ключом,
а остальные поля – дополнительными.
),,,,( 321 naaaa 
naaaa ′≤≤′≤′≤′ 321
),,,,( 321 naaaa ′′′′ 
Сортировка. Общие понятия
 Алгоритмы сортировки, которые не требуют
выделения дополнительного массива для
промежуточного хранения данных, часто
называют алгоритмами сортировки без
дополнительной памяти.
 Если предполагается, что все данные
алгоритма помещаются в оперативной памяти,
то говорят о внутренней сортировке.
Сортировка. Общие понятия
При оценке качества алгоритма сортировки
рассматривают две основные величины:
среднее количество сравнений и среднее
количество перестановок.
Для алгоритма «пузырьковой» сортировки верно, что
как в худшем, так и в лучшем случае.
Алгоритм №1.
«Пузырьковая» сортировка.
Исходный
массив
d c a b
1-ый проход a d c b
2-ой проход a b d c
3-ий проход a b c d
void Buble_Sort(n, A)
{
for(i=1; i<n; i++){
for(j = n-1; j>=i; j--){
if (A[ j-1 ] > A[ j ]) {
key = A[ j-1];
A[ j-1] = A[ j ];
A[ j ] = key; }
}
)()( 2
nOnT =
Алгоритм №2.
Сортировка отбором.
Для алгоритма сортировки отбором верно, что
как в худшем, так и в лучшем случае. Однако число
перестановок для данного алгоритма пропорционально n log n.
Исходный
массив
d c a b
1-ый проход a c d b
2-ой проход a b d c
3-ий проход a b c d
)()( 2
nOnT =
Алгоритм №2.
Сортировка отбором.
void Select_Sort(n, A) {
for(i=0; i<n; i++){
c = i; t = A[ i ]; exchange=0;
for(j = i+1; j<n; j++){
if (A[ j ]<t) {
c = j;
t = A[ j ];
exchange = 1;}
}
if (exchange==1) {
A[ c ] =A[ i ];
A[ i ] = t; } }
}
Алгоритм №3.
Сортировка методом Шелла.
Исходный
массив
f d a c b e
1-ый проход c b a f d e
2-ой проход a b c d e f
Результат a b c d e f
Алгоритм №3.
Сортировка методом Шелла.
 Сортировка Шелла более эффективна, чем
ранее рассмотренные методики, поскольку
сдвигаемые элементы быстро попадают на
свои места. Среднее время работы
В худшем случае время работы .
 Последовательность изменения приращений
может меняться. Хорошо зарекомендовала
себя последовательность 9, 5, 3, 2, 1.
)()( 25.1
nOnT =
)()( 5.1
nOnT =
Алгоритм №3.
Сортировка методом Шелла.
st = { 9,5,3,2,1 }
void Shell_Sort(n, A) {
for(k=0; k<5; k++){
gap = st[ k ];
for( i=gap; i<n; i++){
x = A[ i ];
for ( j=I - gap; x<A[ j ] && j>=0; j = j - gap)
A[ j + gap] = A[ j ];
A[ j + gap ] = x;
}
}
}
Выбор метода сортировки.
 Необходимый метод сортировки всегда
выбирается исходя из контекста задачи.
 При сортировке массивов больших размеров
лучше использовать метод Шелла или
быструю сортировку. На небольших
массивах лучшие результаты могут показать
алгоритмы сортировки вставками, выбором
и даже пузырьковая сортировка.
Выбор метода сортировки.
 Существует ряд методов сортировки,
позволяющих сортировать массивы за меньшее
время, при условии, что заранее известна
структура сортируемых объектов.
 Для сортировки последовательности чисел
используются алгоритмы сортировки
подсчетом, вычерпыванием и цифровой
сортировки, обеспечивающих среднее время:
)()( nOnT =
Алгоритм №4.
Сортировка подсчетом.
 Алгоритм применим, если каждый элемент
сортируемой последовательности – целое
положительное число, не превосходящее
заранее известное k.
 Идея алгоритма в том, чтобы для каждого
элемента X подсчитать сколько элементов
входной последовательности больше него, а
затем вставить его в нужное место выходного
массива.
Алгоритм №4.
Сортировка подсчетом.
void Counting_Sort(n, A, B) {
for(i=0; i<k; i++){ C[ i ] = 0; }
for(i=0; i<n; i++){ C[ A[ i ] ] = C[ A[ i ]]+1 };
for(i=1; i<k; i++){ C[ i ] = C[ i ]+C[ i-1 ] };
for(i = n; i>=0; i--) {
B [ C[ A[ i ] ] ] = A[ i ];
C [ A[ i ] ] = C[ A[ i ] ] -1;
}
}
Поиск.
 Нахождение информации в неотсортированном
массиве требует последовательного поиска,
начиная с первого элемента и завершая его при
нахождении совпадения или достижении конца
массива. Этот процесс также называют
линейным поиском.
 Усовершенствовать алгоритм поиска можно,
если входная последовательность будет
отсортирована.
Алгоритм №5.
Бинарный поиск.
void Binary_Search(A, n, key) {
low = 0; high=n-1;
while(low<=high){
mid = (low+high)/2;
if(key<A[mid]) high=mid-1;
else if (key>A[mid]) low=mid+1;
else return mid;
}
return -1;
}
Порядковые статистики.
 Если расположить элементы входной
последовательности по возрастанию, i-ый по
счету ее элемент называется i-той
порядковой статистикой.
 Минимум последовательности – 1-ая
порядковая статистика.
 Максимум последовательности – n-ая
порядковая статистика.
 Медиана – элемент, находящийся посредине
между максимумом и минимумом.

Лекция 2 Сортировки, поиск и порядковые статистики

  • 1.
  • 2.
    Сортировка. Общие понятия Задача сортировки получает на входе последовательность и в результате выдает перестановку , такую что  Обычно сортируются не отдельные числа, а целые записи. При этом поле, по которому производится сортировка, называется ключом, а остальные поля – дополнительными. ),,,,( 321 naaaa  naaaa ′≤≤′≤′≤′ 321 ),,,,( 321 naaaa ′′′′ 
  • 3.
    Сортировка. Общие понятия Алгоритмы сортировки, которые не требуют выделения дополнительного массива для промежуточного хранения данных, часто называют алгоритмами сортировки без дополнительной памяти.  Если предполагается, что все данные алгоритма помещаются в оперативной памяти, то говорят о внутренней сортировке.
  • 4.
    Сортировка. Общие понятия Приоценке качества алгоритма сортировки рассматривают две основные величины: среднее количество сравнений и среднее количество перестановок.
  • 5.
    Для алгоритма «пузырьковой»сортировки верно, что как в худшем, так и в лучшем случае. Алгоритм №1. «Пузырьковая» сортировка. Исходный массив d c a b 1-ый проход a d c b 2-ой проход a b d c 3-ий проход a b c d void Buble_Sort(n, A) { for(i=1; i<n; i++){ for(j = n-1; j>=i; j--){ if (A[ j-1 ] > A[ j ]) { key = A[ j-1]; A[ j-1] = A[ j ]; A[ j ] = key; } } )()( 2 nOnT =
  • 6.
    Алгоритм №2. Сортировка отбором. Дляалгоритма сортировки отбором верно, что как в худшем, так и в лучшем случае. Однако число перестановок для данного алгоритма пропорционально n log n. Исходный массив d c a b 1-ый проход a c d b 2-ой проход a b d c 3-ий проход a b c d )()( 2 nOnT =
  • 7.
    Алгоритм №2. Сортировка отбором. voidSelect_Sort(n, A) { for(i=0; i<n; i++){ c = i; t = A[ i ]; exchange=0; for(j = i+1; j<n; j++){ if (A[ j ]<t) { c = j; t = A[ j ]; exchange = 1;} } if (exchange==1) { A[ c ] =A[ i ]; A[ i ] = t; } } }
  • 8.
    Алгоритм №3. Сортировка методомШелла. Исходный массив f d a c b e 1-ый проход c b a f d e 2-ой проход a b c d e f Результат a b c d e f
  • 9.
    Алгоритм №3. Сортировка методомШелла.  Сортировка Шелла более эффективна, чем ранее рассмотренные методики, поскольку сдвигаемые элементы быстро попадают на свои места. Среднее время работы В худшем случае время работы .  Последовательность изменения приращений может меняться. Хорошо зарекомендовала себя последовательность 9, 5, 3, 2, 1. )()( 25.1 nOnT = )()( 5.1 nOnT =
  • 10.
    Алгоритм №3. Сортировка методомШелла. st = { 9,5,3,2,1 } void Shell_Sort(n, A) { for(k=0; k<5; k++){ gap = st[ k ]; for( i=gap; i<n; i++){ x = A[ i ]; for ( j=I - gap; x<A[ j ] && j>=0; j = j - gap) A[ j + gap] = A[ j ]; A[ j + gap ] = x; } } }
  • 11.
    Выбор метода сортировки. Необходимый метод сортировки всегда выбирается исходя из контекста задачи.  При сортировке массивов больших размеров лучше использовать метод Шелла или быструю сортировку. На небольших массивах лучшие результаты могут показать алгоритмы сортировки вставками, выбором и даже пузырьковая сортировка.
  • 12.
    Выбор метода сортировки. Существует ряд методов сортировки, позволяющих сортировать массивы за меньшее время, при условии, что заранее известна структура сортируемых объектов.  Для сортировки последовательности чисел используются алгоритмы сортировки подсчетом, вычерпыванием и цифровой сортировки, обеспечивающих среднее время: )()( nOnT =
  • 13.
    Алгоритм №4. Сортировка подсчетом. Алгоритм применим, если каждый элемент сортируемой последовательности – целое положительное число, не превосходящее заранее известное k.  Идея алгоритма в том, чтобы для каждого элемента X подсчитать сколько элементов входной последовательности больше него, а затем вставить его в нужное место выходного массива.
  • 14.
    Алгоритм №4. Сортировка подсчетом. voidCounting_Sort(n, A, B) { for(i=0; i<k; i++){ C[ i ] = 0; } for(i=0; i<n; i++){ C[ A[ i ] ] = C[ A[ i ]]+1 }; for(i=1; i<k; i++){ C[ i ] = C[ i ]+C[ i-1 ] }; for(i = n; i>=0; i--) { B [ C[ A[ i ] ] ] = A[ i ]; C [ A[ i ] ] = C[ A[ i ] ] -1; } }
  • 15.
    Поиск.  Нахождение информациив неотсортированном массиве требует последовательного поиска, начиная с первого элемента и завершая его при нахождении совпадения или достижении конца массива. Этот процесс также называют линейным поиском.  Усовершенствовать алгоритм поиска можно, если входная последовательность будет отсортирована.
  • 16.
    Алгоритм №5. Бинарный поиск. voidBinary_Search(A, n, key) { low = 0; high=n-1; while(low<=high){ mid = (low+high)/2; if(key<A[mid]) high=mid-1; else if (key>A[mid]) low=mid+1; else return mid; } return -1; }
  • 17.
    Порядковые статистики.  Еслирасположить элементы входной последовательности по возрастанию, i-ый по счету ее элемент называется i-той порядковой статистикой.  Минимум последовательности – 1-ая порядковая статистика.  Максимум последовательности – n-ая порядковая статистика.  Медиана – элемент, находящийся посредине между максимумом и минимумом.