Методи упорядкування елементів списку
Згадаємо основні типи задач опрацювання елементів списку:
Під час опрацювання таблиць часто виникає потреба впорядкувати дані в таблиці за деякою ознакою. Числові дані можна відсортувати за величиною (наприклад, розташування в масиві значень маси деталей за зростанням), рядкові дані — в алфавітному порядку (упорядкування списку учнів).
Клас List у Python має метод sort():
Сортування елементів масиву — це впорядкування їх за деякою ознакою.
<список>.sort( [reverse=False])
де reverse — необов'язковий параметр, що вказує тип сортування.
За замовчуванням сортування відбувається за неспаданням (reverse=False). Для сортування за незростанням слід задати значення reverse=True, або після сортування за замовчуванням застосувати метод reverse().
Щоб зрозуміти сутність алгоритмів сортування, розглянемо два найпростіші методи сортування масиву. Нехай потрібно впорядкувати елементи списку arr із 10 елементів за неспаданням:
arr[1] ≤ arr[2] ≤ ... ≤ arr[10]
Приклад:
Упорядкуємо елементи списку arr за незростанням.
arr1 = [23, 12, 3, 45, 6, 7, 8, 4, 21, 81]
arr1.sort()
arr1.reverse() # arr1 = [81, 45, 23, 21, 12, 8, 7, 6, 4, 3]
arr1 = [23, 12, 3, 45, 6, 7, 8, 4, 21, 81]
arr1.sort()
arr1.reverse() # arr1 = [81, 45, 23, 21, 12, 8, 7, 6, 4, 3]
arr2 = [23, 12, 3, 45, 6, 7, 8, 4, 21, 81]
arr2.sort(reverse=True) ) # arr2 = [81, 45, 23, 21, 12, 8, 7, 6, 4, 3]
arr2.sort(reverse=True) ) # arr2 = [81, 45, 23, 21, 12, 8, 7, 6, 4, 3]
arr[1] ≤ arr[2] ≤ ... ≤ arr[10]
Сортування вибором максимального елемента
Метод сортування вибором полягає в пошуку на неопрацьованому зрізі списку максимального значення і подальшому обміні цього значення з останнім елементом неопрацьованого зрізу. На наступному кроці неопрацьований зріз зменшується на один елемент.
Алгоритм сортування вибором максимального елемента
Поки довжина неупорядкованої частини списку більше 1, повторювати:
- знайти в неупорядкованому зрізі списку максимальне значення;
- поміняти місцями максимальне значення з останнім елементом неупорядкованого зрізу;
- зменшити довжину неопрацьованого зрізу на один елемент.
Реалізуємо алгоритм у вигляді функції. Список arr заповнимо 10 випадковими числами.
from random import randint | |
def sort_select(): | # Заголовок функції сортування |
for k in range(len(arr)–1, 0, –1): |
# При кожній ітерації циклу
переглядається зріз [0: k+1]
|
mk = max(arr[0: k+1]) |
# Знайшли максимальний
елемент у зрізі arr[0: k+1]
|
m = arr[0: k+1].index(mk) |
# Визначили індекс
максимального елемента
|
arr[k], arr[m] = arr[m], arr[k] |
# Максимальний елемент
поміняли місцями з останнім у зрізі
|
Основна програма
|
|
arr = []
for i in range(10):
arr.append(randint(1, 30))
|
# Заповнення списку
випадковими числами
|
print(arr)
|
# Виведення початкового списку |
sort_select() | # Виклик функції сортування |
print(arr) | # Виведення упорядкованого списку |
Приклад:
Приклад виконання:
[21, 27, 15, 20, 1, 29, 12, 18, 26, 2]
[1, 2, 12, 15, 18, 20, 21, 26, 27, 29]
[21, 27, 15, 20, 1, 29, 12, 18, 26, 2]
[1, 2, 12, 15, 18, 20, 21, 26, 27, 29]
Сортування обміном (метод бульбашки)
Метод бульбашки — це метод упорядкування списку шляхом послідовного порівняння й обміну сусідніх елементів, якщо попередній елемент виявляється більшим за наступний.
Розглянемо сортування масиву arr=[3,1,2,5] за спаданням. Переглядаємо частини списку довжиною k = 4..2.
І ітерація. Довжина неупорядкованої частини списку k = 4.
• 3<1? Ні.
• 1<2? Так. 1 і 2 міняємо місцями.
• 1<5? Так. 1 i 5 міняємо місцями.
• 1<2? Так. 1 і 2 міняємо місцями.
• 1<5? Так. 1 i 5 міняємо місцями.
IІ ітерація. k = 3.
• 3<2? Ні.
• 2<5? Так. 1 і 2 міняємо місцями.
• 2<5? Так. 1 і 2 міняємо місцями.
IIІ ітерація. k = 2.
• 3<5? Так. 3 і 5 міняємо місцями.
Для скорочення числа ітерацій зовнішнього циклу можна ввести допоміжну змінну prap типу bool, яка виконує роль прапорця. Вона отримує значення True в тому випадку, якщо відбулася хоча б одна перестановка сусідніх елементів. Якщо значення рrap не змінилось, це означає, що елементи списку вже впорядковані й подальший перегляд списку не потрібний.
Реалізуємо алгоритм у вигляді функції.
def sort_bulb():
prap = True
k = len(arr)–1
while prap:
prap = False
for i in range(k):
if arr[i]<arr[i+1]:
arr[i], arr[i+1] = arr[i+1], arr[i]
prap = True
k = k–1
Приклад:
Проаналізуємо виконання алгоритму на прикладі списку:
arr = [5, 10, 1, 6, 4].
arr = [5, 10, 1, 6, 4].
І ітерація. k = 4. [10, 5, 6, 4, 1] prap = True.
ІI ітерація. k = 3. [10, 6, 5, 4, 1] prap = True.
ІII ітерація. k = 2. [10, 6, 5, 4, 1] prap = False.
ІI ітерація. k = 3. [10, 6, 5, 4, 1] prap = True.
ІII ітерація. k = 2. [10, 6, 5, 4, 1] prap = False.
Уже на третій ітерації елементи виявились упорядкованими за спаданням, змінна prap = False, тому зовнішній цикл припиняє роботу.
Джерела:
Інформатика : підруч. для 9 кл. закл. загал. серед. освіти / [О. О. Бондаренко, В. В. Ластовецький, О. П. Пилипчук, Є. А. Шестопалов]. — Харків : Вид-во «Ранок», 2022