Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 основи програмування книга.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

7.12. Сортування вибором

Приклад 7.10.

Основна дія сортування вибором – пошук найменшого елемента в частині масиву, що переглядається і перестановка з першим елементом цієї частини:

For i := 1 to n - 1 do begin

k := Індекс( Min(a[i], ..., a[n]));

Переставити a[i], a[k]

end;

Const

n = 100;

Type

Vector = array[1..n] of Real;

Procedure SelectSort (Var a: Vector);

Var

i, j, MinIndex : Integer;

Temp : Real;

Begin

For i := 1 to n - 1 do begin

{ пошук мінімального елемента }

MinIndex := i;

for j := i + 1 to n do

If a[j] < a[MinIndex]

then MinIndex := j;

{перестановка елементів}

Temp := a[MinIndex];

a[MinIndex] := a[i];

a[i] := Temp

end;

End;

Аналіз алгоритму сортування вибором

Внутрішній цикл здійснює пошук мінімального елемента. Після виконання оператора If має місце співвідношення

Min = Min(a[i], a[i+1], ... , a[j]),

а після завершення циклу

Min = Min(a[i], a[i+1], ... , a[n]).

Після перестановки маємо

a[i] = Min(a[i], a[i+1], ... , a[n]).

Зовнішній цикл керує довжиною частини масиву, що переглядається. Після виконання тіла зовнішнього циклу початок масиву вже відсортований:

a[1]  a[2]  ....  a[i]

Після завершення зовнішнього циклу отримаємо:

a[1]  a[2]  ...  a[n-1], a[n-1] = Min(a[n-1], a[n]),

тобто масив відсортований.

Зовнішній цикл виконався n-1 разів. Внутрішній цикл виконується і-1 разів (i = n-1, n-2, ...,1). Кожне виконання тіла внутрішнього циклу складається в одному порівнянні. Тому

C(n) = 1 + 2 + ... + n - 1 = n(n - 1)/2,

Перестановка елементів здійснюється у зовнішньому циклі. Тому

M(n) = 3(n - 1)

Як і алгоритм сортування обмінами, цей алгоритм є стійким. Дійсно, блок пошуку мінімального елемента в хвості масиву шукає мінімальний елемент з найменшим індексом, тому перестановки будуть стійкими. Можна зробити висновок, що просте сортування вибором ефективніше сортування простими обмінами за критерієм M(n). Якщо послідовність, що сортується, складається з даних великого розміру, цей критерій може мати вирішальне значення.

7.13. Задачі і вправи

І.Скласти програму табулювання функції z = f(x, y) у прямокутнику [a, b]*[c, d] з кроком табуляції h і точністю 

Функція z = f(x,y)

[a, b]

[c, d]

h

1

z = ln(1 + x2 + y2)

[ -2, 3 ]

[ -1, 3 ]

0.1

10-5

2

z = sin2(2x+y)

[ -, /2 ]

[ -2,  ]

0.2

10-6

3

z = exp(x2+y2)

[ -2, 2 ]

[ -2, 2 ]

0.1

10-5

4

z = 1/(tg2(x+y)+1)

[ -/2, /2 ]

[ -,  ]

0.2

10-4

5

z = ln(x+sqrt(x2+y2))

[ -2, 3 ]

[ -2, 3 ]

0.1

10-5

  1. Розробити програму, яка за даним натуральним числом N обчислює N! (0!=1, 1! = 1, при N > 1 N! = 1*2*...*N). Ваша програма повинна контролювати діапазон цілих чисел, для яких вона працює правильно.

  2. Послідовність Фібоначчі визначається таким чином: f(0)= 0, f(1) = 1, f(k) = f(k-1) + f(k-2) при k >=2. Розробити програму, яка за даним натуральним числом N обчислює f(N). Ваша програма повинна контролювати діапазон цілих чисел, для яких вона працює правильно.

  3. Розробити програму, яка за даним натуральним числом N та дійсним числом x обчислює суму S(N, x) = 1/0! + x/1! + ... + xN/N!. Треба, щоб кількість операцій (виконаних команд присвоєння) була б не більшою ніж C*n для деякої константи С.

  4. Розробити програму, яка за даним натуральним числом N та дійсним числом x в єдиному арифметичному циклі обчислює суми

C(N, x) = 1/0! - x2/2! + x4 /4! ... + (-1)N* x 2N/(2N)!.

S(N, x) = x/1! - x3/3! + x5 /5! ... + (-1)N* x 2N+1/(2N+1)!.

Треба, щоб кількість операцій (виконаних команд присвоєння) була б не більшою ніж C*n для деякої константи С.

  1. Розробити програму пошуку наближених найбільшого та найменшого значень функції

y = (1/Pi)*Sin(x2/Pi)

на інтервалі [a, b] методом послідовного обчислення значень цієї функції на даному інтервалі з кроком h зміни значень змінної x.

  1. Розробити програму наближеного обчислення визначеного інтеграла f(x)dx на відрізку [a, b] за формулою середніх прямокутників при фіксованому числі N розбиття відрізку інтегрування [a, b] на N рівних частин.

  2. Розробити програму, яка за даним додатнім дійсним числом R, даним додатнім натуральним числом p < 10, даним додатнім натуральним числом N обчислює запис R в p-ічній системі числення з точністю 1/pN . Результат потрібно вивести на екран у вигляді

R = a1 a2 ... ak , b1 b2 ... bN (p),

де a1 a2 ... ak - ціла частина, b1 b2 ... bN - дробова частина запису R в p-ічній системі числення з потрібною точністю.

  1. Розробити програму, яка за даним натуральним числом N = a1 a2 ... ak формує число M = ak ak-1 ... a1 (число M складається з цифр числа N, розташованими у зворотному порядку). Числа N та M визначте в програмі як дані типу LongInt.

ІІ. Скласти програму розв’язування задачі і оцінити її складність:

  1. Дано числовий масив А[1..n]. Знайти суму всіх елементів A, що стоять між A[1] і A[n].

  2. Дано числовий масив А[1..n]. Підрахувати середнє арифметичне всіх від’ємних і всіх додатних його елементів.

  3. Дано числовий масив А[1..n]. Знайти всі його елементи, менші, ніж всі попередні.

  4. Дано числовий масив A[1..n]. Знайти в цьому масиві найбільшу за кількістю елементів зростаючу підпослідовність елементів, що йдуть підряд.

  5. Дано числовий масив A[1..n], що складається з непарного (n = 2k+1) числа попарно нерівних елементів. Знайти середній за величиною елемент у масиві.

  6. Дано масиви А[1..n] і В[1..m]. Знайти всі елементи масиву A, що не входять у В.

  7. Дано масиви А[1..n] і В[1..m]. Знайти всі елементи масиву A, що входять у В.

  8. Дано числовий масив A[1..n]. Величину Sij визначимо наступним чином:

Sii = A[i],

Sij = A[i] + A[i+1] + ... + A[j] при i < j

Sij = Sji при i > j

Знайти Max Sij при 1  i, j  n

  1. Дано масив А[1..n], елементами якого є цілі числа. Розробити програму пошуку всіх його елементів, менших, ніж всі попередні (іншими словами, потрібно знайти та роздрукувати всі такі індекси j, для яких справедлива умова: для будь-якого i < j A[i] < A[j]).

  2. Дано масив A[1..n], елементами якого є дійсні числа. Розробити програму, яка знаходить в цьому масиві найбільшу за кількістю елементів зростаючу підпослідовність елементів, розташованих підряд: a[i] < a[i+1] < . . . < a[j].

  3. Дано числовий масив A[1..n], який містить непарну (n = 2k+1) кількість попарно нерівних елементів. Розробити програму, яка шукає середній за величиною елемент в цьому масиві.

  4. Дано масив A[1..n], складений з дійсних чисел. Розробити програму, яка шукає в цьому масиві найменше додатне число.

  5. Послідовність з n точок площини задана масивами Х[1..n] та Y[1..n] координат цих точок. Розробити програму, яка шукає в цій послідовності точку, наймеш віддалену від початку координат.

  6. Елемент A[i] числового масиву A[1..n] називається бар’єрним, якщо

A[j] <= A[i] при j < i та A[j] >= A[i] при j > i.

Розробити програму, яка шукає всі бар’єрні елементи масиву А.

ІІІ. Скласти програму розв’язування задачі і оцінити її складність:

  1. Дано числовий масив А[1..n, 1..m]. Знайти сідлову точку масиву або встановити її відсутність. (Елемент двомірного масиву називається сідловою точкою, якщо він максимальний у своєму стовпці і мінімальний у своєму рядку.)

  2. Дано числовий масив А[1..n, 1..m]. Знайти стовпець, сума квадратів елементів якого мінімальна.

  3. Дано числовий масив А[1..n, 1..m]. Знайти всі елементи А менші, ніж усі сусідні. (Сусідніми називаються елементи, індекси яких відрізняються на 1).