Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ: ΠΎΡ‚ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… Π΄ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Ρ…

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ тСзисы

  • Бписки Python (list) β€” это динамичСскиС массивы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ.
  • Для понимания Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π°ΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со статичСским массивом, отслСТивая Π΅Π³ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.
  • Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ классичСскиС ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ сортировки (O(nΒ²)): вставками, Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΈ ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠΌ.
  • Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° подсчётом β€” Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ (O(n)), ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ нСбольшом Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π Π°Π±ΠΎΡ‚Π° со списками ΠΈ массивами Π² Python

БтатичСский массив (Ρ€ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅)

  • Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (n) для хранСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ количСства элСмСнтов.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Π΅Ρ†: a[n] = x; n += 1.
  • Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ с ΠΊΠΎΠ½Ρ†Π°: n -= 1.

ДинамичСский массив (список list)

  • АвтоматичСски управляСт ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Π΅Ρ†: a.append(x).
  • Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ с ΠΊΠΎΠ½Ρ†Π° с Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ значСния: x = a.pop().
  • ВСкущая Π΄Π»ΠΈΠ½Π°: len(a).

List comprehension (гСнСрация списков)

  • Π›Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΉ ΠΈ быстрый способ создания списков.
  • Бинтаксис: [<Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅> for <пСрСмСнная> in <ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚>].
  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€: [x**2 for x in range(10)] создаёт список ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ².
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ: [x**2 for x in a if x % 2 == 0].
  • Π’ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Ρ€Π½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€: [0 if x < 0 else x**2 for x in a].

ΠšΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ сортировки (O(nΒ²))

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° вставками (Insertion Sort)

  • ИдСя: Π§Π°ΡΡ‚ΡŒ массива (слСва) поддСрТиваСтся отсортированной. Новый элСмСнт ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ "вставляСтся" Π² эту Ρ‡Π°ΡΡ‚ΡŒ, сдвигая Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ элСмСнты Π²ΠΏΡ€Π°Π²ΠΎ.
  • Π˜Π½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ слСва ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ всСгда отсортированы.
  • РСализация: Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Ρ†ΠΈΠΊΠ» Π±Π΅Ρ€Ρ‘Ρ‚ элСмСнты начиная со Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ. Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ» (while) сдвигаСт Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ элСмСнт Π²Π»Π΅Π²ΠΎ, ΠΏΠΎΠΊΠ° ΠΎΠ½ мСньшС сосСда слСва ΠΈ Π½Π΅ достиг Π½Π°Ρ‡Π°Π»Π°.

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ (Selection Sort)

  • ИдСя: Массив дСлится Π½Π° ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π»Π΅Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΈ Π½Π΅ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΏΡ€Π°Π²ΡƒΡŽ. На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС Π² ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ выбираСтся ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт ΠΈΠ· нСотсортированной ΠΈ ставится Π½Π° своё мСсто.
  • Π˜Π½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ слСва ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ стоят Π½Π° своих ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… мСстах.
  • РСализация: Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Ρ†ΠΈΠΊΠ» ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ для вставки ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ°. Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ» ΠΈΡ‰Π΅Ρ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт Π² нСотсортированной части ΠΈ мСняСт Π΅Π³ΠΎ с элСмСнтом Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ.

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠΌ (Bubble Sort)

  • ИдСя: ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ массиву, сравнивая сосСдниС элСмСнты. Если ΠΎΠ½ΠΈ стоят Π² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС, мСняСм ΠΈΡ… мСстами. Π—Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ "всплываСт" самый ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΉ элСмСнт.
  • Π˜Π½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: ПослС k ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ² k самых ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… элСмСнтов стоят Π½Π° своих ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… мСстах Π² ΠΊΠΎΠ½Ρ†Π΅ массива.
  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ: НС Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ ΡƒΠΆΠ΅ отсортированному "хвосту" массива.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° программирования: TDD-ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

ΠœΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ

  1. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ функция, которая провСряСт ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ….
  2. Π—Π°Ρ‚Π΅ΠΌ рСализуСтся сам Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
  3. Запуск тСстов Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

def test_sort(sort_algorithm):
    a = [4, 2, 5, 1, 3]
    a_sorted = [1, 2, 3, 4, 5]
    sort_algorithm(a)
    print("OK" if a == a_sorted else "FAIL")

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° подсчётом (Count Sort) β€” O(n)

  • УсловиС примСнимости: НСобходимо Π·Π½Π°Ρ‚ΡŒ нСбольшой Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ элСмСнтов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΎΡ‚ 0 Π΄ΠΎ 9).
  • ИдСя: ВмСсто пСрСстановок элСмСнтов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ частотный Π°Π½Π°Π»ΠΈΠ·.
    1. Боздаётся массив-счётчик f Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ с Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ нулями.
    2. Π—Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ исходным Π΄Π°Π½Π½Ρ‹ΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта x увСличиваСтся счётчик f[x] += 1.
    3. Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ отсортированный массив формируСтся ΠΏΡƒΡ‚Ρ‘ΠΌ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ значСния d количСство Ρ€Π°Π·, Ρ€Π°Π²Π½ΠΎΠ΅ f[d].
  • ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ: ЛинСйная ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠΎΠΏΠ°Ρ€Π½Ρ‹Ρ… сравнСний элСмСнтов.
  • НСдостаток: Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти, ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.