Bölüm 19: Temel Sıralama Algoritmaları
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
Karşılaştırma ve Selection
Her turda kalan en küçüğü seçip yerine koymak.
Selection sort kaç takas yapar?
Giriş
Öğrenme Çıktıları
Her turda kalan en küçüğü seçip yerine koymak.
Yeni öğeyi sıralı ön ek içinde doğru yere kaydırmak.
Takas yapılmayan turda erken sonlandırmak.
Anahtar aralığı küçükse karşılaştırmasız sıralama yapmak.
Temel Kavramlar
Sıralama seçimi veri dağılımına bağlıdır
Aynı O(n²) sınıfındaki algoritmalar bile sıralıya yakın veri, takas sayısı ve kararlılık açısından farklı davranır.
Az takas, her durumda çok karşılaştırma.
Sıralıya yakın veride çok hızlı.
Komşu takaslarla büyükleri sona taşır.
Anahtar aralığını ek bellek olarak kullanır.
Temel Kavramlar
Kavram Haritası
Gösterim
İlk iki insertion turu
C ile Gerçekleştirim
Sıralama yordamı sözleşmesi
typedef int (*Karsilastir)(const void *, const void *);
void insertion_sort(int a[], size_t n);
void selection_sort(int a[], size_t n);
void bubble_sort(int a[], size_t n);C ile Gerçekleştirim
C'de Bellek ve Sahiplik
Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.
Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.
Boyut, kapasite ve geçerli indisleri her işlemde koru.
NULL, boş yapı ve tek öğe durumlarını özellikle en küçük değeri değil indisini tutmamak riskiyle birlikte test et.
Temel İşlemler
Insertion sort
for (size_t i = 1; i < n; ++i) {
int anahtar = a[i];
size_t j = i;
while (j > 0 && a[j - 1] > anahtar) {
a[j] = a[j - 1]; --j;
}
a[j] = anahtar;
}Temel İşlemler
Kodu Okurken
Selection sort kaç takas yapar?
Her adımda selection kuralı korunuyor mu?
Yeni öğeyi sıralı ön ek içinde doğru yere kaydırmak.
Insertion'da anahtarı kaydırmadan önce korumamak
Adım Adım
Selection sort bir tur
Sıralanmamış bölgenin ilk indisini en küçük kabul et.
Kalan öğeleri karşılaştır ve en küçüğün indisini tut.
Bulunan en küçüğü bölgenin başıyla değiştir.
Sıralı ön ek bir öğe büyür.
Sınıf Notu
Dersten Sesler
“Dizi sıralıysa hemen çıkacak şekilde daha dikkatli kodlanabilir.”
“Küçük girdiler yanıltıcı olabilir; belli bir noktadan sonra artışın nasıl patladığına bakın.”
Notlardaki sınıf içi anlatımdan, yazım ve uzunluk bakımından sunuma uyarlanmıştır.
Analiz
Karmaşıklık Özeti
| İşlem | Zaman | Ek bellek |
|---|---|---|
| Selection | O(n²) | O(1) |
| Insertion, en iyi | O(n) | O(1) |
| Insertion, kötü | O(n²) | O(1) |
| Bubble, iyileştirilmiş en iyi | O(n) | O(1) |
| Counting | O(n+k) | O(k) |
n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı
Tasarım Kararı
Hangi Durumda Hangisi?
Yazma/takas maliyeti yüksekse.
Küçük veya neredeyse sıralı dizilerde.
Öğretim ve yerel takas davranışı için; üretimde nadiren.
Tamsayı anahtar aralığı küçük ve biliniyorsa.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- Selection sort kaç takas yapar?
- Insertion sort ne zaman O(n)'dir?
- Bubble sort erken nasıl biter?
- Counting sort neden karşılaştırmalı değildir?
- Kararlı sıralama ne demektir?
Cevapları göster
- En fazla n-1.
- Dizi zaten sıralı veya sıralıya çok yakınsa.
- Bir turda hiç takas yapılmazsa.
- Anahtarları sayaç dizisine doğrudan indisler.
- Eşit anahtarlı kayıtların göreli sırasını korur.
Uygulama
Mini Laboratuvar
Selection sort kaç takas yapar?
Bubble sort erken nasıl biter?
Kararlı sıralama ne demektir?
Özet
Bölüm Özeti
Veri düzeni ve yazma maliyeti önemlidir.
Sıralıya yakın veri avantaj sağlar.
Counting sort O(n+k) sunar.
Özet
Kaynaklar ve Devam
- VYA1 seçimli sıralama; VYA2 sıralama bölümünün ilk kısmı
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.