Məzmuna keç
Educora
Orta9–11-ci sinif18 dəq28 / 59

Çeşidləmə alqoritmləri

Qabarcıq, seçmə və daxiletmə üsulları ilə çeşidləmənin necə işlədiyini öyrən və bu alqoritmlərin sürətini müqayisə et.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Çeşidləmənin nə üçün lazım olduğunu izah etmək
  • Qabarcıq, seçmə və daxiletmə üsullarını addım-addım yerinə yetirmək
  • Alqoritmləri apardıqları müqayisələrin sayına görə müqayisə etmək

Telefonundakı kontaktlar əlifba sırası ilə, oyundakı reytinq cədvəli xallara görə, onlayn mağazada məhsullar isə qiymətə görə düzülür. Bütün bu hallarda kompüter çeşidləmə (nizamlama) aparır — elementləri müəyyən qaydaya görə sıraya düzür. Üstəlik, əvvəlki dərsdə gördük ki, sürətli ikili axtarış yalnız nizamlanmış siyahıda işləyir. Bəs kompüter siyahını necə nizamlayır?

Tərif
Çeşidləmə

Siyahının elementlərini müəyyən qaydaya görə — məsələn, artan və ya azalan sıra ilə, yaxud əlifba sırası ilə — yenidən düzmək.

Qabarcıq üsulu

Qabarcıq üsulunda qonşu elementlər cüt-cüt müqayisə olunur: soldakı sağdakından böyükdürsə, onların yeri dəyişdirilir. Siyahının bir dəfə başdan-başa yoxlanmasına keçid deyilir. Hər keçiddən sonra qalan elementlərin ən böyüyü suyun içindəki qabarcıq kimi «üzə çıxır» — siyahının sonuna gedir. Hansısa keçiddə heç bir yerdəyişmə olmasa, siyahı artıq nizamlanıb.

Nümunə: qabarcıq üsulu

[5, 1, 4, 2] siyahısını qabarcıq üsulu ilə artan sıra ilə düz.

Həllini göstər
1-ci keçid:
5 > 1 → yerdəyişmə: [1, 5, 4, 2]
5 > 4 → yerdəyişmə: [1, 4, 5, 2]
5 > 2 → yerdəyişmə: [1, 4, 2, 5] — 5 öz yerindədir.
2-ci keçid:
1 < 4 → dəyişmir
4 > 2 → yerdəyişmə: [1, 2, 4, 5] — 4 öz yerindədir.
3-cü keçid:
1 < 2 → dəyişmir. Yerdəyişmə olmadı — siyahı nizamlanıb: [1, 2, 4, 5].
Cəmi 3 + 2 + 1 = 6 müqayisə aparıldı.
İnteraktiv
Simulyasiya yüklənir…
Sütunların necə müqayisə olunduğuna və ən hündür sütunun hər keçiddə sona «üzdüyünə» bax.
Python
def bubble_sort(a):
    a = a[:]
    n = len(a)
    for i in range(n - 1):
        swapped = False
        for j in range(n - 1 - i):
            if a[j] > a[j + 1]:
                a[j], a[j + 1] = a[j + 1], a[j]
                swapped = True
        if not swapped:
            break
    return a

print(bubble_sort([5, 1, 4, 2]))
print(sorted(['Murad', 'Aysel', 'Leyla', 'Elvin']))
▸ Gözlənilən nəticə
[1, 2, 4, 5]
['Aysel', 'Elvin', 'Leyla', 'Murad']
swapped dəyişəni keçiddə yerdəyişmə olub-olmadığını yadda saxlayır: olmayıbsa, alqoritm vaxtından əvvəl dayanır. Python-un hazır sorted() funksiyası sətirləri də əlifba sırası ilə düzür.

Seçmə üsulu

Seçmə üsulunda siyahının nizamlanmamış hissəsində ən kiçik element tapılır və həmin hissənin birinci elementi ilə yeri dəyişdirilir. Beləliklə, soldakı nizamlanmış hissə hər addımda bir element böyüyür.

Nümunə: seçmə üsulu

[29, 10, 14, 37, 13] siyahısını seçmə üsulu ilə artan sıra ilə düz.

Həllini göstər
1-ci addım: ən kiçik element 10-dur, onu 29 ilə dəyişirik → [10, 29, 14, 37, 13]
2-ci addım: [29, 14, 37, 13] hissəsində ən kiçiyi 13-dür, onu 29 ilə dəyişirik → [10, 13, 14, 37, 29]
3-cü addım: [14, 37, 29] hissəsində ən kiçiyi 14-dür, o, artıq öz yerindədir.
4-cü addım: [37, 29] hissəsində ən kiçiyi 29-dur, onu 37 ilə dəyişirik → [10, 13, 14, 29, 37].

Daxiletmə üsulu

Daxiletmə üsulu kart oyunçusunun əlindəki kartları düzməsinə bənzəyir: o, növbəti kartı götürür və onu artıq düzülmüş kartlar arasında öz yerinə «daxil edir». Siyahı demək olar ki, nizamlanmış olanda bu üsul çox sürətli işləyir.

Nümunə: daxiletmə üsulu

[4, 3, 5, 1] siyahısını daxiletmə üsulu ilə düz.

Həllini göstər
Başlanğıcda nizamlanmış hissədə yalnız 4 var.
3-ü götürürük: 3 < 4, onu 4-dən əvvələ qoyuruq → [3, 4, 5, 1]
5-i götürürük: 5 > 4, yerində qalır → [3, 4, 5, 1]
1-i götürürük: 5, 4 və 3 bir yer sağa sürüşür, 1 başa keçir → [1, 3, 4, 5].
İnteraktiv
Simulyasiya yüklənir…
Hər yeni elementin nizamlanmış hissədə öz yerinə necə daxil edildiyini izlə.

Hansı alqoritm daha sürətlidir?

Çeşidləmənin sürəti adətən müqayisələrin sayı ilə ölçülür. Üç sadə üsulun hər biri ən pis halda təxminən n(n − 1) / 2 müqayisə aparır: n = 10 üçün 45, n = 1000 üçün isə 499 500. Siyahı 10 dəfə uzananda iş təxminən 100 dəfə artır!

K = n(n − 1) / 2K = n(n − 1) / 2
burada:
  • Kən pis halda müqayisələrin sayı
  • nsiyahıdakı elementlərin sayı
ÜsulİdeyaƏn pis halArtıq nizamlanmış siyahı
Qabarcıqqonşuları müqayisə edib yerlərini dəyişməkn(n − 1) / 2n − 1 (erkən dayanma ilə)
Seçməən kiçiyi tapıb əvvələ qoymaqn(n − 1) / 2n(n − 1) / 2
Daxiletməhər elementi nizamlanmış hissəyə daxil etməkn(n − 1) / 2n − 1
Müqayisələrin sayı (n — elementlərin sayı)

Əsas fikirlər

  • Çeşidləmə elementləri müəyyən qaydaya görə sıraya düzür; ikili axtarış üçün nizamlanmış siyahı lazımdır.
  • Qabarcıq üsulu qonşuları müqayisə edir; hər keçiddən sonra ən böyük element sona gedir.
  • Seçmə üsulu hər dəfə ən kiçik elementi tapıb nizamlanmamış hissənin əvvəlinə qoyur.
  • Daxiletmə üsulu hər elementi nizamlanmış hissədə öz yerinə daxil edir.
  • Sadə üsullar ən pis halda n(n − 1) / 2 müqayisə aparır; böyük siyahılar üçün daha sürətli alqoritmlər var.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
Qabarcıq üsulunda hansı elementlər müqayisə olunur?