![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Вставка: кожний новий елемент вставляється у правильну позицію стосовно вже розміщених у масиві і впорядкованих елементів.
4. Злиття: впорядковані підмножини елементів об’єднуються в більші впорядковані підмножини. 5. Розподіл: машинна модифікація ручних методів упорядкування. Наприклад, упорядкування листів на пошті. Перша механічна версія такого упорядкування називається цифровим упорядкуванням. Ключ упорядкування розділяється на цифри, дані впорядковуються за значенням старшої цифри, потім отримані підмножини упорядковуються за значенням наступної цифри і так далі. Розглянемо алгоритм упорядкування вибіркою. Приклад. Нехай задано масив цілих чисел Для упорядкування елементів масиву за зростанням шукається мінімальний елемент і міняється місцям з першим елементом. На наступному кроці шукається мінімальний серед тих елементів, що залишилися, і міняється місцям з другим елементом і т. д. Останній Програма упорядкування за зростанням масиву цілих чисел має вигляд:
Program LABR5_1; {$APPTYPE CONSOLE} uses Sysutils; VAR a: array[1..300] of integer; n, i, j, k, r: integer; BEGIN {Введення початкових даних} writeln(‘Введіть розмір масиву а, (n< =300)’); readln(n); writeln(‘Введіть елементи масиву а’); for i: =1 to n do read(a[i]); {Упорядкування за зростанням методом вибірки} for i: =1 to n-1 do begin k: =i; for j: =i+1 to n do if a[j]< a[k] then k: =j; r: =a[i]; a[i]: =a[k]; a[k]: =r; end; {Виведення масиву по п’ять елементів у рядку} for i: =1 to n do if i mod 5 < > 0 then write(a[i]: 6) else writeln(a[i]: 6); readln; END.
Розглянемо алгоритм злиття упорядкованих масивів. Цей алгоритм можна використовувати як для внутрішнього, так і зовнішнього впорядкування. Приклад. Нехай задано два впорядкованих за зростанням елементів масиви цілих чисел Для злиття масивів порівнюємо елементи масивів
Program LABR5_2; {$APPTYPE CONSOLE} uses Sysutils; VAR a: array[1..300] of integer; b: array[1..200] of integer; c: array[1..500] of integer; n, m, i, j, k: integer; BEGIN {Введення початкових даних} writeln(‘Введіть розмір масиву а, (n< =300)’); readln(n); writeln(‘Введіть впорядковані елементи масиву а’); for i: =1 to n do read(a[i]); writeln(‘Введіть розмір масиву b, (m< =200)’); readln(m); writeln(‘Введіть впорядковані елементи масиву b’); for i: =1 to m do read(b[i]); {Впорядкування злиттям} i: =1; j: =1; k: =0; while (i < = n) and (j < = m) do if a[i] < b[j] then begin k: =k+1; c[k]: =a[i]; i: =i+1; end else begin k: =k+1; c[k]: =b[j]; j: =j+1; end; if i > n then for i: =j to m do begin k: =k+1; c[k]: =b[i]; end else for j: =i to n do begin k: =k+1; c[k]: =a[j]; end; {Виведення впорядкованого масиву} { по п’ять елементів у рядку} for i: =1 to k do if i mod 5 < > 0 then write(c[i]: 6) else writeln(c[i]: 6); readln; END. Пошук даних. Задача пошуку даних є основною при роботі з великими обcягами інформації. Якщо дані не впорядковані, то пошук зводиться до послідовного перегляду всіх ключів. Якщо дані впорядковані, то існує ряд ефективних алгоритмів пошуку даних. Розглянемо один з таких алгоритмів пошуку ключа поділом масиву даних навпіл. Приклад. Нехай задано масив упорядкованих за зростанням цілих чисел Для пошуку заданого елемента встановимо ознаку Програма пошуку ключа в упорядкованому масиві методом поділу масиву навпіл має вигляд: Program LABR5_3; {$APPTYPE CONSOLE} uses Sysutils; VAR x: array[1..300] of integer; n, i, a, b, kl: integer; f: boolean; BEGIN {Введення початкових даних} writeln(‘Введіть розмір масиву x, (n< =300)’); readln(n); writeln(‘Введіть упорядковані елементи масиву x’); for i: =1 to n do read(x[i]); writeln(‘Введіть елемент kl’); readln(kl); {Пошук заданого елемента в упорядкованому масиві x} a: =1; b: =n; f: =false; while (a < b) and (not f) do begin i: =(a+b) div 2; {поділ масиву навпіл} if x[i] = kl then f: =true; if x[i] < kl then a: =i+1; if x[i] > kl then b: =i -1; end; if f then writeln(‘Номер шуканого ключа в масиві =’, i) else writeln(‘Шуканого ключа у масиві немає’); readln; END.
|