Сортування елементів у одновимірних масивах
Задача 1. При роботі з масивами даних не рідко виникає завдання їх сортування за зростанням або спаданням, тобто упорядкування. Це означає, що елементи того ж масиву потрібно розташувати строго по порядку. Наприклад, в разі сортування за зростанням попередній елемент повинен бути менше наступного (або дорівнює йому).
Розв’язання
Існує безліч методів сортування. Одні з них є більш ефективними, інші - простіше для розуміння. Досить простий для розуміння є сортування методом бульбашки, який також називають методом простого обміну. У чому ж він полягає, і чому у нього така дивна назва: "метод бульбашки"?
Як відомо повітря легше води, тому бульбашки повітря спливають. Це просто аналогія. У сортуванні методом бульбашки по зростанню легші (з меншим значенням) елементи поступово "спливають" в початок масиву, а більш важкі один за одним опускаються на дно (до кінця масиву).
Алгоритм і особливості цього сортування такі:
1. При першому проході по масиву елементи попарно порівнюються між собою: перший з другим, потім другий з третім, слідом третій з четвертим і т.д. Якщо попередній елемент виявляється більше наступного, то їх міняють місцями.
2. Не важко здогадатися, що поступово найбільше число виявляється останнім. Інша частина масиву залишається відсортованої, хоча деяке переміщення елементів з меншим значенням в початок масиву спостерігається.
3. При другому проході нема чого порівнювати останній елемент з передостаннім. Останній елемент вже стоїть на своєму місці. Значить, число порівнянь буде на одне менше.
4. На третьому проході вже не треба порівнювати передостанній і третій елемент з кінця. Тому число порівнянь буде на два менше, ніж при першому проході.
5. В кінці кінців, при проході по масиву, коли залишаються тільки два елементи, які треба порівняти, виконується тільки одне порівняння.
6. Після цього перший елемент нема з чим порівнювати, і, отже, останній прохід по масиву не потрібен. Іншими словами, кількість проходів по масиву m-1, де m - це кількість елементів масиву.
7. Кількість порівнянь в кожному проході одно m-i, де i - це номер проходу по масиву (перший, другий, третій і т.д.).
8. При обміні елементів масиву зазвичай використовується "буферна" (третя) змінна, куди тимчасово поміщається значення одного з елементів.
Програма на мові Паскаль:
const
m = 10;
var
arr: array[1..m] of integer;
i, j, k: integer;
begin
randomize;
write ('Початковий масив: ');
for i := 1 to m do begin
arr[i] := random(256);
write (arr[i]:4);
end;
writeln; writeln;
for i := 1 to m-1 do
for j := 1 to m-i do
if arr[j] > arr[j+1] then begin
k := arr[j];
arr[j] := arr[j+1];
arr[j+1] := k
end;
write ('Відсортований масив: ');
for i := 1 to m do
write (arr[i]:4);
writeln;
readln
end.
Найшвидший алгоритм Хоора(Гоара) для сортування одновимірного масиву у вигляді процедури мовою програмування Pascal
Ця процедура, після її оголошення, сортує масив mas, який складається з елементів типу integer.
Задача 2. Випадковим чином задається двомірний масив(цe таблиця чисeл) , що складається із nxn елементів, якщо n менше 100. Вивести масив на екран у вигляді таблиці чисел та знайти суму елементів, що розташовані на обох діагоналях масиву. Вивести одномірними масивами елементи окрeмо верхнього і окрeмо нижнього трикутника матриці без головної діагоналі знайти суму елементів верхнього трикутника та сума елементів нижнього трикутника квадратної матриці nxn.
Розв′язання.
Program Summa_trukutnuk_matriza;
const m=100; n=100;
var sum,f,s, d, c:real; b:array[1..m*n] of real;
xn:array[1..m*n] of real; xv:array[1..m*n] of real; a:array[1..m,1..n] of real;
i,j,p, g, k:integer;
begin
writeln(' Ввeдіть кількість рядків квадратного масиву, яка мeншe 100 ');
readln(k); s:=0;
for i:=1 to k do
for j:=1 to k do begin
a[i,j]:=int(random*20-10);
b[(i-1)*k+j]:=a[i,j]; end; writeln(' ');
writeln(' Масив випадкових чисeл: '); writeln(' ');
for i:=1 to k do begin
for j:=1 to k do begin write(' a[',i,';',j,']:= ',a[i,j] {' b[',i-1*k+j,']= ',b[(i-1)*k+j]});
end; writeln(' '); end;
s:=0; for i:=1 to k do begin s:=s+a[i,i]; end;
f:=0; for i:=1 to k do begin f:=f+a[i,k+1-i]; end;
if k mod 2 =1 then sum:=s+f- a[k div 2 +1, k div 2 +1] else sum:=s+f;
p:=1; g:=1; for i:=1 to k do begin
for j:=k downto 1 do begin
if i<j then begin
xv[g]:= a[i,j]; g:=g+1; end; end; end;
for i:=1 to k do begin
for j:=1 to i-1 do begin
if i>j then begin
xn[p]:= a[i,j]; p:= p+1; end; end; end;
writeln(' Масив чисeл нижнього трикутника матриці : ');
d:=0; for i:=1 to ((k-1)*k) div 2 do begin d:=d+ xn[i];
write(' xn[',i,']= ', xn[i]); end; writeln(' ');
writeln(' Масив чисeл вeрхнього трикутника матриці : ');
c:=0; for i:=1 to ((k-1)*k) div 2 do begin
c:=c+ xv[i]; write(' xv[', i, ']= ', xv[i]); end; writeln(' ');
writeln(' Сума чисел головної діагоналі матриці:', s); writeln(' ');
writeln(' Сума чисел бічної діагоналі матриці :', f); writeln(' ');
writeln(' Сума чисел на обох діагоналях: ', sum); writeln(' ');
writeln(' Сума чисел верхнього трикутника матриці ' , c); writeln(' ');
writeln(' Сума чисел нижнього трикутника матриці ' , d); writeln(' '); end.
Задача 3. Вагони
(Час: 1 сек. Пам'ять: 16 Мб Складність: 23%)
Щодня диспетчеру залізничної станції доводиться переставляти вагони в багатьох поїздах, щоб вони йшли в заданому порядку. Для цього диспетчер може розчепити прийшов на станцію складу в довільних місцях і переставити утворилися зчіпки з одного або декількох вагонів в довільному порядку. Порядок вагонів в одній зчепленні міняти не можна, також не можна розгорнути всю зчеплення так, щоб останній вагон в зчепленні виявився першим в ній.
Відомі алгоритми сортування
За час
- Сортування вибором — ( англ. Selection sort ) — пошук найменшого або найбільшого елемента і переміщення його в початок або кінець впорядкованого списку.
- Сортування вставкою — (англ. Insertion sort) — Визначаємо місце де поточний елемент повинен знаходитися в упорядкованому списку, і вставляємо його туди.
- Сортування обміном (сортування бульбашкою ( англ. Bubble sort )) — для кожної пари індексів проводиться обмін, якщо елементи розташовані не по порядку.
- Сортування методом бінарної вставки
За час
- Плавне сортування (англ. Smoothsort)
За час з використанням додаткової інформації про елементи
За час
За час
В даному розділі розглянуто набір реалізацій А.Нікітін на мові Pascal стандартних алгоритмів, застосовуваних при вирішенні завдань олімпіадного програмування.
- Підрахунок різних букв в слові
- Перестановка букв в слові (циклічний зсув вправо)
- Перевірка рядки на "паліндромний"
- Друк всіх дільників натурального числа A
- Друк всіх скоєних чисел до 10000
- Друк всіх простих чисел до 500
- Підрахунок суми цифр числа
- Підрахунок суми елементів одновимірного масиву
- Підрахунок суми елементів двомірного масиву
- Пошук максимального елемента в масиві
- Пошук мінімального елемента в масиві
- Пошук середнього арифметичного в масиві
- Друк всіх елементів масиву з інтервалу C..D
- Циклічний зсув елементів масиву вправо
- Друк самого часто зустрічається елемента з масиву
- Чи всі елементи масиву різні?
- Сортування масиву "бульбашкою"
- Рішення рівняння: A * x ^ 2 + B * x + C = 0
- Обчислення довжини відрізка | AB |
- Яка точка (A або B) ближче до початку координат
- Обчислення площі трикутника по 3 вершин
- Чи потрапляє точка M (x, y) в коло з центром O (Xc, Yc) і радіусом R
- Перекладу десяткового числа в двійкове
- Перекладу двійкового числа в десяткове
- Перекладу десяткового числа в шістнадцяткове
- Перекладу шістнадцятирічного числа в десяткове
- Рекурсивні алгоритми: знаходження НСД і НСК двох чисел
- Рекурсивні алгоритми: обчислення факторіала
- Рекурсивні алгоритми: генерація перестановок
- Рекурсивні алгоритми: швидке сортування
- Рішення системи 2-х рівнянь з двома невідомими
- Рішення системи 3-х рівнянь з трьома невідомими
- Визначення перетину двох відрізків
- Визначення положення точки відносно сектора
- Положення точки щодо вектора
- Положення точки щодо трикутника (варіант 1)
- Положення точки щодо трикутника (варіант 2)
- Моделювання додавання двійкових чисел
- Моделювання віднімання двійкових чисел
- Зведення цілого числа в натуральну ступінь (варіант 1)
- Зведення цілого числа в натуральну ступінь (варіант 2)
- Множення довгих натуральних десяткових чисел
- Кодування: приклад простий кодування (зрушення по ключу)
- Обробка тексту: підрахунок кількості слів в тексті
- Обробка тексту: виділення слів з тексту
- Обробка тексту: виділення чисел з тексту
- Обробка тексту: дозвіл введення тільки цифр
- Обробка тексту: переклад в маленькі букви (нижній регістр)
- Обробка тексту: переклад в заголовні букви (верхній регістр)
- Обробка тексту: видалення з тексту Комметаріі типу {...}
- Бек-трекінг: Міста
- Бек-трекінг: Прохід по лабіринту
- Бек-трекінг: Доміно
- Бек-трекінг: Послідовність
- Бек-трекінг: Магічний квадрат