Bölüm 2: Sıralama Algoritmaları
Çoktan Seçmeli · Sıralama Ölçütleri
Soru 1: Kararsız Algoritma
Kayıtlar yalnızca sayıya göre sıralanıyor: (3, A), (1, B), (3, C). Aşağıdaki algoritmalardan hangisi (sunumdaki kodlarıyla) A ile C'nin göreli sırasını bozabilir?
C: Seçimli sıralama ilk turda en küçük (1, B)'yi baştaki (3, A) ile takas eder: (1, B), (3, C), (3, A). Uzun mesafeli takas eşit anahtarların sırasını bozar. Kabarcık (yalnızca > ise takas), eklemeli (yalnızca > olanı kaydırır) ve birleştirme (eşitlikte soldan alır) kararlıdır.
Çoktan Seçmeli · Sıralama Ölçütleri
Soru 2: Yerinde ve Kararlı
Aşağıdakilerden hangisi hem yerinde (O(1) ek bellek) hem kararlı bir sıralama algoritmasıdır?
D: Eklemeli sıralama yalnızca gecici değişkenini kullanır ve eşit öğeleri kaydırmaz. Birleştirme kararlıdır ama Θ(n) yardımcı dizi ister; heap sort yerindedir ama kök–son takası kararlılığı bozar; hızlı sıralama da kararsızdır ve O(log n) yığın kullanır.
Çıktı Sorusu · Kabarcık Sıralaması
Soru 3: Her Turdan Sonra
Aşağıdaki kod [5, 2, 8, 1] dizisi için ne yazdırır? Zaman karmaşıklığı nedir?
for (int i = 0; i < dizi.length - 1; i++) { for (int j = 0; j < dizi.length - i - 1; j++) { if (dizi[j] > dizi[j + 1]) { int tmp = dizi[j]; dizi[j] = dizi[j + 1]; dizi[j + 1] = tmp; } } System.out.println(Arrays.toString(dizi)); }
Cevabı göster
[2, 5, 1, 8] [2, 1, 5, 8] [1, 2, 5, 8]
- 1. tur: 5↔2, 8↔1 → en büyük (8) sona yerleşir.
- 2. tur: 5↔1 → 5 yerine oturur.
- 3. tur: 2↔1.
Bayrak olmadığından her girdi için (n − 1) + … + 1 = n(n − 1)/2 karşılaştırma → Θ(n²). Bayrak eklenirse sıralı girdide tek turda durur: en iyi durum Θ(n).
Adım Adım Çalıştırma · Kabarcık Sıralaması
Soru 4: Bayraklı Kabarcık: Turlar
Bayraklı kabarcık sıralaması [5, 2, 4, 6, 1, 3] dizisine uygulanıyor. Her tur sonunda dizi nedir, algoritma hangi turda durur?
n = 6. Her tur komşu çiftleri soldan sağa karşılaştırır; tur sonunda kalanların en büyüğü sona yerleşir.
Tur i = 0: 5 karşılaştırma, 4 takas. 6 son yerine (indis 5) oturdu; bayrak true.
Tur i = 1: 4 karşılaştırma, 2 takas. 5 son yerine (indis 4) oturdu; bayrak true.
Tur i = 2: 3 karşılaştırma, 2 takas. 4 son yerine (indis 3) oturdu; bayrak true.
Tur i = 3: 2 karşılaştırma, 1 takas. 3 son yerine (indis 2) oturdu; bayrak true.
Tur i = 4: 1 karşılaştırma, hiç takas yok → bayrak false → break. Toplam 5 + 4 + 3 + 2 + 1 = 15 karşılaştırma, 9 takas.
boolean yerDegistiMi; for(int i = 0; i < n - 1; i++) { yerDegistiMi = false; for(int j = 0; j < n - 1 - i; j++) { if(dizi[j] > dizi[j+1]) { int gecici = dizi[j]; dizi[j] = dizi[j+1]; dizi[j+1] = gecici; yerDegistiMi = true; } } if(yerDegistiMi == false) break; }
Çoktan Seçmeli · Kabarcık Sıralaması
Soru 5: Ters Sıralı Girdi
6 öğeli ters sıralı [6, 5, 4, 3, 2, 1] dizisine kabarcık sıralaması uygulanıyor. Kaç karşılaştırma ve kaç takas yapılır?
A: Her turda tüm komşu çiftler terstir: 5 + 4 + 3 + 2 + 1 = 15 karşılaştırma ve her biri bir takas. Takas sayısı ters çift sayısına eşittir: n(n − 1)/2 = 15. Bayrak burada yardımcı olmaz; her turda takas vardır.
Çoktan Seçmeli · Kabarcık Sıralaması
Soru 6: Sıralı Girdide Bayrak
1000 öğeli, zaten artan sıralı bir diziye bayraklı kabarcık sıralaması uygulanırsa kaç karşılaştırma yapılır?
C: İlk turda 999 komşu çift karşılaştırılır, hiç takas olmaz; bayrak false kalır ve break ile çıkılır: n − 1 = 999 → Θ(n). Bayraksız sürüm 499.500 = n(n − 1)/2 karşılaştırma yapardı.
Çıktı Sorusu · Eklemeli Sıralama
Soru 7: Karşılaştırma ve Kaydırma Sayısı
Eklemeli sıralama [5, 2, 4, 6, 1, 3] dizisini sıralarken dizi[j] > gecici karşılaştırması kaç kez yapılır, kaç kaydırma yapılır?
for(int i = 1; i < n; i++) { int gecici = dizi[i]; int j = i - 1; while(j >= 0 && dizi[j] > gecici) { dizi[j+1] = dizi[j]; j = j - 1; } dizi[j+1] = gecici; }
Cevabı göster
| i | gecici | karş. | kaydırma | sonra |
|---|---|---|---|---|
| 1 | 2 | 1 | 1 | 2 5 4 6 1 3 |
| 2 | 4 | 2 | 1 | 2 4 5 6 1 3 |
| 3 | 6 | 1 | 0 | 2 4 5 6 1 3 |
| 4 | 1 | 4 | 4 | 1 2 4 5 6 3 |
| 5 | 3 | 4 | 3 | 1 2 3 4 5 6 |
Toplam 12 karşılaştırma, 9 kaydırma. Kaydırma = ters çift sayısı (9). i = 1 ve i = 4'te j = −1'e inilince j >= 0 yanlış olur, ek karşılaştırma yapılmaz.
Çoktan Seçmeli · Eklemeli Sıralama
Soru 8: İkili Arama ile Ekleme
Eklemeli sıralamada anahtarın yerleşeceği konum, sıralı kısımda ikili arama ile bulunursa en kötü durum zaman karmaşıklığı ne olur?
C: Karşılaştırmalar O(n log n)'e iner, ama anahtara yer açmak için ondan büyük öğelerin yine tek tek kaydırılması gerekir; ters sıralı girdide 1 + 2 + … + (n − 1) kaydırma → toplam Θ(n²).
Çoktan Seçmeli · Eklemeli Sıralama
Soru 9: Saklanmayan Anahtar
Eklemeli sıralamada int gecici = dizi[i]; satırı silinip karşılaştırmalar doğrudan dizi[i] ile yapılırsa ne olur?
D: İlk kaydırma dizi[j+1] = dizi[j], j = i − 1 iken dizi[i]'nin üzerine yazar. Anahtar kaybolur ve koşul artık yanlış değerle karşılaştırılır. Bu yüzden anahtar önce bir değişkende saklanır; kaydırmalar onun hücresini kullanır.
Çıktı Sorusu · Seçimli Sıralama
Soru 10: Seçimli: Ekran Çıktısı
Dizi [7, 3, 9, 4, 2] iken aşağıdaki kod ne yazdırır? Kaç gerçek takas yapılır?
for (int i = 0; i < dizi.length - 1; i++) { int gecici = i; for (int j = i + 1; j < dizi.length; j++) { if (dizi[j] < dizi[gecici]) { gecici = j; } } if (gecici != i) { yerDegistir(dizi, i, gecici); } System.out.println(Arrays.toString(dizi)); }
Cevabı göster
[2, 3, 9, 4, 7] [2, 3, 9, 4, 7] [2, 3, 4, 9, 7] [2, 3, 4, 7, 9]
- i = 0: en küçük 2 (indis 4) ↔ 7.
- i = 1: en küçük zaten 3 →
gecici == i, takas yok; satır değişmeden yazılır. - i = 2: 4 ↔ 9. i = 3: 7 ↔ 9.
3 takas; karşılaştırma her durumda 4 + 3 + 2 + 1 = 10 → Θ(n²).
Adım Adım Çalıştırma · Seçimli Sıralama
Soru 11: Seçimli Sıralama İzleme
sirala [29, 10, 14, 37, 13] için her turda hangi indisi seçer, dizi nasıl değişir?
n = 5. Her tur sırasız kısmın en küçüğünün indisini bulur ve sırasız kısmın başıyla takas eder.
i = 0: dizi[0..4] taranır (4 karşılaştırma); en küçük 10, indis 1.
dizi[1] ↔ dizi[0] → [10, 29, 14, 37, 13].
i = 1: dizi[1..4] taranır (3 karşılaştırma); en küçük 13, indis 4.
dizi[4] ↔ dizi[1] → [10, 13, 14, 37, 29].
i = 2: dizi[2..4] taranır (2 karşılaştırma); en küçük 14, indis 2.
enKucuk == i: öğe kendisiyle takas edilir; dizi değişmez.
i = 3: dizi[3..4] taranır (1 karşılaştırma); en küçük 29, indis 4.
dizi[4] ↔ dizi[3] → [10, 13, 14, 29, 37]. Son öğe kendiliğinden yerinde: 4 + 3 + 2 + 1 = 10 karşılaştırma.
public void sirala(int[] dizi) { int n = dizi.length; for(int i = 0; i < n - 1; i++) { int enKucuk = i; for(int j = i + 1; j < n; j++) if(dizi[j] < dizi[enKucuk]) enKucuk = j; int gecici = dizi[enKucuk]; dizi[enKucuk] = dizi[i]; dizi[i] = gecici; } }
Çoktan Seçmeli · Seçimli Sıralama
Soru 12: Kararsızlık Örneği
Seçimli sıralamanın kararsız olduğunu gösteren girdi ve ilk tur sonucu hangisidir? (2ₐ ve 2ᵦ eşit anahtarlı iki kayıt)
C: En küçük öğe 1 sondadır; baştaki 2ₐ ile takas edilince 2ₐ, 2ᵦ'nin arkasına atlar ve son dizi [1, 2ᵦ, 2ₐ] olur. B'de 1 ile 2ₐ komşu olduğu için takas eşitlerin sırasını bozmaz; A ve D'de takas gerekmez.
Adım Adım Çalıştırma · Kabuk Sıralaması
Soru 13: Kabuk Sıralaması İzleme
kabukSirala [9, 8, 3, 7, 5, 6, 4, 1] dizisine uygulanıyor. Her aralık değerinden sonra dizi nedir?
n = 8; aralık dizisi n/2 = 4, 2, 1. Aynı renkteki öğeler (aralarında aralik kadar indis olanlar) birlikte eklemeli sıralanır.
aralik = 4: gruplar [9, 5], [8, 6], [3, 4], [7, 1].
Her grup kendi içinde sıralandı (3 kaydırma) → [5, 6, 3, 1, 9, 8, 4, 7].
aralik = 2: gruplar [5, 3, 9, 4], [6, 1, 8, 7].
Her grup kendi içinde sıralandı (5 kaydırma) → [3, 1, 4, 6, 5, 7, 9, 8].
aralik = 1 sıradan eklemeli sıralamadır; dizi neredeyse sıralı olduğu için yalnızca 3 kaydırma gerekti. Sonuç [1, 3, 4, 5, 6, 7, 8, 9].
void kabukSirala(int[] dizi) { int n = dizi.length; for (int aralik = n / 2; aralik > 0; aralik /= 2) for (int i = aralik; i < n; i++) { int gecici = dizi[i], j = i; while (j >= aralik && dizi[j - aralik] > gecici) { dizi[j] = dizi[j - aralik]; j -= aralik; } dizi[j] = gecici; } }
Çoktan Seçmeli · Kabuk Sıralaması
Soru 14: Kabuk Sıralamasının Özellikleri
Kabuk sıralaması (n/2, n/4, …, 1 aralıklarıyla) için hangisi doğrudur?
D: Önceki turlar uzaktaki küçük öğeleri tek hamlede öne taşır; aralık = 1 turu bu yüzden az iş yapar. Kabuk sıralaması yerindedir (O(1) ek bellek) ve kararsızdır: farklı gruplardaki eşit öğeler birbirinin üzerinden atlayabilir.
Çıktı Sorusu · Birleştirme Sıralaması
Soru 15: birlestir Çağrıları
birlestirmeliSirala(dizi, 0, 6) çağrısı [38, 27, 43, 3, 9, 82, 10] dizisini sıralarken birlestir kaç kez çağrılır? İlk dört birleştirmenin sonucu (birleştirilen aralık) nedir?
void birlestirmeliSirala(int[] dizi, int sol, int sag) { if (sol < sag) { int orta = sol + (sag - sol) / 2; birlestirmeliSirala(dizi, sol, orta); birlestirmeliSirala(dizi, orta + 1, sag); birlestir(dizi, sol, orta, sag); } }
Cevabı göster
birlestir 6 kez (n − 1) çağrılır. Sırasıyla:
- [0..1] → [27, 38]
- [2..3] → [3, 43]
- [0..3] → [3, 27, 38, 43]
- [4..5] → [9, 82]
- [4..6] → [9, 10, 82]
- [0..6] → [3, 9, 10, 27, 38, 43, 82]
Sol yarı tamamen sıralanmadan sağ yarıya geçilmez (derinlik öncelikli). orta = sol + (sag − sol)/2 olduğu için sol yarı bir öğe fazla alır: [0..3] ve [4..6].
Adım Adım Çalıştırma · Birleştirme Sıralaması
Soru 16: Birleştirme Sıralaması: Özyineleme
birlestirmeliSirala(dizi, 0, 5) [5, 2, 4, 7, 1, 3] dizisi için çalışıyor. Birleştirmeler hangi sırayla yapılır, her birinden sonra dizi nasıldır?
sol = 0, sag = 5 → orta = 2. Önce sol yarı [0..2] tamamen sıralanacak.
[0..2]: orta = 1 → önce [0..1].
[0..0] ve [1..1] tek öğeli (taban durum). birlestir(0, 0, 1) → [2, 5].
[2..2] tek öğeli. birlestir(0, 1, 2): [2, 5] + [4] → [2, 4, 5]. Sol yarı bitti.
Sağ yarı [3..5]: orta = 4 → önce [3..4].
birlestir(3, 3, 4): [7] + [1] → [1, 7].
birlestir(3, 4, 5): [1, 7] + [3] → [1, 3, 7].
Son birleştirme birlestir(0, 2, 5): [2, 4, 5] + [1, 3, 7] → [1, 2, 3, 4, 5, 7]. Toplam 5 = n − 1 birleştirme.
void birlestirmeliSirala(int[] dizi, int sol, int sag) { if (sol < sag) { int orta = sol + (sag - sol) / 2; birlestirmeliSirala(dizi, sol, orta); birlestirmeliSirala(dizi, orta + 1, sag); birlestir(dizi, sol, orta, sag); } }
Çoktan Seçmeli · Birleştirme Sıralaması
Soru 17: Eşitlikte Hangi Taraf?
birlestir metodunda if (L[i] <= R[j]) koşulu if (L[i] < R[j]) yapılırsa ne olur?
B: Eşitlikte R'den alınır; R'deki kayıt girdide L'dekinden sonra geldiği için eşit anahtarların göreli sırası değişir. Sıralama yine doğrudur, her öğe bir kez yazılır; Θ(n log n) değişmez.
Çoktan Seçmeli · Birleştirme Sıralaması
Soru 18: 8 Öğede En Çok Karşılaştırma
Birleştirme sıralaması 8 öğeli bir diziyi en kötü durumda en fazla kaç öğe karşılaştırmasıyla sıralar?
B: m öğeli bir birleştirme en fazla m − 1 karşılaştırma ister. Düzeyler: 4 birleştirme × 1 + 2 × 3 + 1 × 7 = 17. 24 = n log₂ n üst tahminidir; 28 = n(n − 1)/2 basit algoritmaların sayısıdır; 7 yalnızca son birleştirmedir.
Klasik Soru · Birleştirme Sıralaması
Soru 19: Ters Çift Sayımı
Bir dizideki ters çift sayısını (i < j iken dizi[i] > dizi[j]) O(n log n) sürede bulan bir yöntem önerin. [3, 1, 2, 5, 4] için sonucu bulun.
Cevabı göster
Birleştirme sıralamasını değiştirin: birlestir içinde sağdan (R'den) bir öğe alındığında, L'de kalan tüm öğeler ondan büyüktür ve onunla ters çift oluşturur: sayaca L.length − i eklenir. Sol ve sağ yarının kendi ters çiftleri özyinelemeyle sayılır.
[3, 1, 2, 5, 4]: ters çiftler (3,1), (3,2), (5,4) → 3. Bu sayı eklemeli sıralamanın kaydırma, kabarcık sıralamasının takas sayısıdır.
Toplam iş birleştirme sıralamasıyla aynıdır: T(n) = 2T(n/2) + Θ(n) = Θ(n log n). Kaba kuvvet (tüm çiftler) Θ(n²) sürer.
Adım Adım Çalıştırma · Hızlı Sıralama
Soru 20: Lomuto Parçalama
parcala(dizi, 0, 7) [7, 2, 1, 6, 8, 5, 3, 4] dizisi için çalışıyor. Her j'de i ve dizi nasıl değişir, metot ne döndürür?
pivot = dizi[7] = 4 (koyu); i = −1: ≤ pivot bölgesi (mavi) boş. Kırmızı: > pivot, beyaz: henüz bakılmadı.
j = 0: 7 > 4 → yalnızca j ilerler; kırmızı bölge büyür.
j = 1: 2 ≤ 4 → i = 0; takas(dizi, 0, 1) → [2, 7, 1, 6, 8, 5, 3, 4].
j = 2: 1 ≤ 4 → i = 1; takas(dizi, 1, 2) → [2, 1, 7, 6, 8, 5, 3, 4].
j = 3: 6 > 4 → yalnızca j ilerler; kırmızı bölge büyür.
j = 4: 8 > 4 → yalnızca j ilerler; kırmızı bölge büyür.
j = 5: 5 > 4 → yalnızca j ilerler; kırmızı bölge büyür.
j = 6: 3 ≤ 4 → i = 2; takas(dizi, 2, 6) → [2, 1, 3, 6, 8, 5, 7, 4].
Döngü bitti: takas(dizi, i + 1 = 3, 7) → [2, 1, 3, 4, 8, 5, 7, 6]. return 3: pivot kesin yerinde; solu ≤ 4, sağı > 4. 7 karşılaştırma → Θ(n).
int parcala(int[] dizi, int alt, int ust) { int pivot = dizi[ust]; int i = alt - 1; for (int j = alt; j < ust; j++) { if (dizi[j] <= pivot) { i++; takas(dizi, i, j); } } takas(dizi, i + 1, ust); return i + 1; }
Çıktı Sorusu · Hızlı Sıralama
Soru 21: İlk Parçalamadan Sonra
hizliSirala(dizi, 0, 7) çağrısında dizi [3, 8, 2, 5, 1, 4, 7, 6] ise ilk parcala çağrısından sonra dizi ve p nedir? Ardından hangi iki özyinelemeli çağrı yapılır?
void hizliSirala(int[] dizi, int alt, int ust) { if (alt < ust) { int p = parcala(dizi, alt, ust); hizliSirala(dizi, alt, p - 1); hizliSirala(dizi, p + 1, ust); } }
Cevabı göster
pivot = 6. ≤ 6 olanlar sırayla öne alınır: 3, 2, 5, 1, 4.
Dizi: [3, 2, 5, 1, 4, 6, 7, 8], p = 5.
Sonraki çağrılar: hizliSirala(dizi, 0, 4) ve hizliSirala(dizi, 6, 7). Pivot (indis 5) hiçbir çağrıya katılmaz: yerine oturmuştur. Sağ taraftaki 8 ve 7, son takasla [7, 8] sırasına gelmiştir ama sağ çağrı yine çalışır.
Çoktan Seçmeli · Hızlı Sıralama
Soru 22: Sıralı Girdi ve Son Öğe Pivot
Son öğeyi pivot alan hızlı sıralama, 1000 öğeli zaten sıralı bir diziyle çağrılırsa kaç karşılaştırma yapar ve özyineleme derinliği ne olur?
B: Pivot her seferinde en büyük öğedir; parçalama yalnızca pivotu ayırır: 999 + 998 + … + 1 = 499.500 karşılaştırma ve n düzeyli özyineleme (T(n) = T(n − 1) + Θ(n) → Θ(n²)). Rastgele pivot ya da üçün ortancası bu durumu önler. 9.966 ≈ n log₂ n dengeli bölmenin sayısıdır.
Çoktan Seçmeli · Hızlı Sıralama
Soru 23: Pivotu Özyinelemeye Katmak
hizliSirala içinde hizliSirala(dizi, alt, p - 1) yerine hizliSirala(dizi, alt, p) yazılırsa ne olabilir?
A: p, sol parçanın son indisidir ve dizi[p] o parçadaki en büyük öğedir. Lomuto parçalaması onu yine pivot seçer, tüm öğeler ≤ pivot olduğu için p yine aynı yere düşer: alt..p aralığı hiç küçülmez → StackOverflowError. Örneğin [1, 2] dizisinde p = 1 olur ve hizliSirala(0, 1) kendini tekrar tekrar çağırır.
Klasik Soru · Hızlı Sıralama
Soru 24: Pivot Seçimi
Hızlı sıralamada pivot seçiminin performansa etkisini [5, 2, 4, 1, 3] dizisi üzerinden açıklayın. En iyi, en kötü ve ortalama durumları ve pratikte kullanılan pivot seçme yöntemlerini yazın.
Cevabı göster
- Kötü pivot 1 seçilirse: sol parça boş, sağ parça 4 öğe. Hep böyle olursa T(n) = T(n − 1) + Θ(n) → Θ(n²) (en kötü durum: sıralı girdi + son/ilk öğe pivot).
- İyi pivot 3 (ortanca): sol [2, 1], sağ [5, 4]. Hep dengeli bölünürse T(n) = 2T(n/2) + Θ(n) → Θ(n log n) (en iyi durum).
- Ortalama: rastgele girdide beklenen ≈ 1,39 n log₂ n karşılaştırma → Θ(n log n).
Pratikte: rastgele pivot (kötü girdi olasılığı ihmal edilebilir, beklenen süre her girdide Θ(n log n)) ya da üçün ortancası (ilk, orta, son öğenin ortancası; sıralı girdide en kötü durumu önler).
Adım Adım Çalıştırma · Heap Sort
Soru 25: Max-Heap Kurma
yiginSirala metodunun ilk aşaması (heap kurma) [2, 7, 4, 1, 8, 6, 5] dizisine uygulanıyor. Hangi takaslar yapılır ve oluşan max-heap nedir?
Dizi tam ikili ağaç olarak düşünülür: dizi[i]'nin çocukları 2i + 1 ve 2i + 2. Yapraklar (i ≥ 3) zaten tek öğeli heap'tir; i = n/2 − 1 = 2'den köke doğru süzülür.
yiginlastir(i = 2): 4 en büyük çocuğundan küçük → 4 ↔ 6 (indis 2 ↔ 5). Dizi [2, 7, 6, 1, 8, 4, 5].
yiginlastir(i = 1): 7 en büyük çocuğundan küçük → 7 ↔ 8 (indis 1 ↔ 4). Dizi [2, 8, 6, 1, 7, 4, 5].
yiginlastir(i = 0): 2 en büyük çocuğundan küçük → 2 ↔ 8 (indis 0 ↔ 1). Dizi [8, 2, 6, 1, 7, 4, 5].
Süzme sürer: 2 en büyük çocuğundan küçük → 2 ↔ 7 (indis 1 ↔ 4). Dizi [8, 7, 6, 1, 2, 4, 5]. Max-heap hazır: kök 8 en büyük öğe.
2. aşamanın ilk turu: kök 8 ↔ dizi[6] = 5 → 8 sıralı bölgeye geçer (kesikli); heap boyutu 6. yiginlastir(0): 5 ↔ 7 → [7, 5, 6, 1, 2, 4, 8].
void yiginSirala(int[] dizi) { int n = dizi.length; for (int i = n / 2 - 1; i >= 0; i--) yiginlastir(dizi, n, i); // 2. aşama: kökü sona al, süz ... }
Çıktı Sorusu · Heap Sort
Soru 26: Heap'i Kur
Aşağıdan yukarı kurma (i = n/2 − 1'den 0'a yiginlastir) [3, 9, 2, 1, 4, 5] dizisine uygulanırsa oluşan max-heap dizisi nedir? Heap sort'un ilk kök–son takasından ve süzmeden sonra dizi ne olur?
void yiginlastir(int[] dizi, int n, int i) { int enBuyuk = i; int sol = 2 * i + 1, sag = 2 * i + 2; if (sol < n && dizi[sol] > dizi[enBuyuk]) enBuyuk = sol; if (sag < n && dizi[sag] > dizi[enBuyuk]) enBuyuk = sag; if (enBuyuk != i) { takas(dizi, i, enBuyuk); yiginlastir(dizi, n, enBuyuk); } }
Cevabı göster
- i = 2: 2 < çocuğu 5 → 2 ↔ 5: [3, 9, 5, 1, 4, 2]
- i = 1: 9 çocuklarından (1, 4) büyük → değişiklik yok
- i = 0: 3 ↔ 9, sonra 3 ↔ 4: [9, 4, 5, 1, 3, 2]
İlk tur: kök 9 ↔ dizi[5] = 2 → [2, 4, 5, 1, 3 | 9]; yiginlastir(0) ile 2 ↔ 5: [5, 4, 2, 1, 3 | 9]. 9 sıralı bölgeye geçti.
Çoktan Seçmeli · Heap Sort
Soru 27: Heap Sort Özellikleri
Heap sort için aşağıdakilerden hangisi doğrudur?
D: n − 1 kez kök sona alınır ve O(log n)'de süzülür; ek dizi gerekmez. Aşağıdan yukarı kurma O(n)'dir (A ters), kök–son takası kararlılığı bozar (B yanlış) ve heap sort uyarlanabilir değildir: sıralı girdide de Θ(n log n) sürer.
Çoktan Seçmeli · Doğrusal Zamanlı Sıralama
Soru 28: Karar Ağacı Sınırı
3 farklı öğeyi yalnızca karşılaştırmayla sıralayan her algoritma en kötü durumda en az kaç karşılaştırma yapmak zorundadır?
B: Karar ağacının 3! = 6 yaprağı olmalıdır; yüksekliği h olan ikili ağacın en fazla 2ʰ yaprağı vardır: 2ʰ ≥ 6 ⇒ h ≥ ⌈log₂ 6⌉ = 3. İki karşılaştırma yalnızca 4 sonucu ayırt edebilir. Genel olarak log₂(n!) = Ω(n log n).
Çoktan Seçmeli · Doğrusal Zamanlı Sıralama
Soru 29: Karşılaştırmadan Sıralamak
Dizinin öğelerini birbiriyle karşılaştırmadan sıralayan algoritma hangisidir ve süresi nedir (k: anahtar aralığı)?
C: Saymalı sıralama her anahtarın kaç kez geçtiğini sayar ve önek toplamlarıyla konumları hesaplar; hiç öğe karşılaştırması yapmaz, bu yüzden Ω(n log n) sınırına tabi değildir. Basamak sıralaması da karşılaştırmasızdır: Θ(d(n + b)). Heap sort, kabuk ve Timsort karşılaştırmalıdır.
Çıktı Sorusu · Doğrusal Zamanlı Sıralama
Soru 30: Sayaç Dizisi
Saymalı sıralamada A = [1, 4, 1, 2, 0, 4, 2] (anahtarlar 0 … 4) için (a) sayma döngüsünden sonra ve (b) önek toplamından sonra sayaç dizisi nedir? 4 anahtarlı son öğe çıktıda hangi indise yazılır?
Cevabı göster
(a) Adetler: [1, 2, 2, 0, 2] (0 bir, 1 iki, 2 iki, 3 yok, 4 iki kez).
(b) Önek toplamı: [1, 3, 5, 5, 7]: sayac[i] = anahtarı ≤ i olan öğe sayısı.
Son döngü sondan başa gezer: A[5] = 4 → cikti[sayac[4] − 1] = cikti[6]. Çıktı: [0, 1, 1, 2, 2, 4, 4]. Sondan başa gezmek eşit anahtarların sırasını korur (kararlı).
Adım Adım Çalıştırma · Doğrusal Zamanlı Sıralama
Soru 31: Saymalı Sıralama İzleme
saymaliSirala [3, 1, 4, 1, 3, 0] dizisi için çalışıyor. Sayaç dizisi ve çıktı dizisi nasıl dolar?
Sayma döngüsü bitti: sayac[x] = x anahtarının adedi → [1, 2, 0, 2, 1]. maks = 4 olduğu için sayaç 5 hücrelidir.
Önek toplamı: sayac[x] = anahtarı ≤ x olan öğe sayısı → [1, 3, 3, 5, 6]. sayac[x] − 1, x'in çıktıdaki son konumudur.
i = 5: dizi[5] = 0 → cikti[sayac[0] − 1] = cikti[0] = 0; sayac[0] = 0.
i = 4: dizi[4] = 3 → cikti[sayac[3] − 1] = cikti[4] = 3; sayac[3] = 4.
i = 3: dizi[3] = 1 → cikti[sayac[1] − 1] = cikti[2] = 1; sayac[1] = 2.
i = 2: dizi[2] = 4 → cikti[sayac[4] − 1] = cikti[5] = 4; sayac[4] = 5.
i = 1: dizi[1] = 1 → cikti[sayac[1] − 1] = cikti[1] = 1; sayac[1] = 1.
i = 0: dizi[0] = 3 → cikti[sayac[3] − 1] = cikti[3] = 3; sayac[3] = 3. Çıktı: [0, 1, 1, 3, 3, 4]. Karşılaştırma yok: Θ(n + k).
int[] saymaliSirala(int[] dizi) { int maks = enBuyuk(dizi); int[] sayac = new int[maks + 1]; for (int x : dizi) sayac[x]++; for (int i = 1; i <= maks; i++) sayac[i] += sayac[i - 1]; int[] cikti = new int[dizi.length]; for (int i = dizi.length - 1; i >= 0; i--) { cikti[sayac[dizi[i]] - 1] = dizi[i]; sayac[dizi[i]]--; } return cikti; }
Çıktı Sorusu · Doğrusal Zamanlı Sıralama
Soru 32: Basamak Sıralaması Geçişleri
[329, 457, 657, 839, 436, 720, 355] dizisi LSD basamak sıralamasıyla (her geçişte kararlı saymalı sıralama) sıralanıyor. Her geçişten sonraki dizi nedir?
Cevabı göster
| Geçiş | Anahtar | Dizi |
|---|---|---|
| 1 | birler | [720, 355, 436, 457, 657, 329, 839] |
| 2 | onlar | [720, 329, 436, 839, 355, 457, 657] |
| 3 | yüzler | [329, 355, 436, 457, 657, 720, 839] |
2. geçişte onlar basamağı 2 olan 720 ile 329, 1. geçişteki sıralarını korur (kararlılık). Kararsız bir ara sıralama, önceki basamakların sırasını bozardı. d = 3, b = 10: Θ(d(n + b)).
Çoktan Seçmeli · Karşılaştırma
Soru 33: Hangi Algoritma?
Disk üzerinde, belleğe sığmayan büyük bir dosyayı sıralamak ya da bir bağlı listeyi sıralamak için en uygun algoritma hangisidir?
A: Birleştirme sıralaması rastgele erişim gerektirmez; öğeleri sırayla okuyup yazar. Dosya parça parça sıralanıp birleştirilir, bağlı liste de ek dizi olmadan birleştirilebilir. Heap sort ve hızlı sıralama indisle rastgele erişime dayanır.