Bölüm 2: Sıralama Algoritmaları

Bölüm 2: Sıralama Algoritmaları · Çalışma Soruları
Kararlılık ve yerinde sıralamaKabarcıkEklemeliSeçimliKabukBirleştirmeHızlıHeap sortSaymalı ve basamakKarşılaştırma
Sercan KÜLCÜ

Ç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?

524613012345

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 sonrası245136012345

Tur i = 0: 5 karşılaştırma, 4 takas. 6 son yerine (indis 5) oturdu; bayrak true.

tur i = 1 sonrası241356012345

Tur i = 1: 4 karşılaştırma, 2 takas. 5 son yerine (indis 4) oturdu; bayrak true.

tur i = 2 sonrası213456012345

Tur i = 2: 3 karşılaştırma, 2 takas. 4 son yerine (indis 3) oturdu; bayrak true.

tur i = 3 sonrası123456012345

Tur i = 3: 2 karşılaştırma, 1 takas. 3 son yerine (indis 2) oturdu; bayrak true.

tur i = 4 sonrası123456012345

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
igecicikarş.kaydırmasonra
12112 5 4 6 1 3
24212 4 5 6 1 3
36102 4 5 6 1 3
41441 2 4 5 6 3
53431 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?

291014371301234

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.

291014371301234ienKucuk

i = 0: dizi[0..4] taranır (4 karşılaştırma); en küçük 10, indis 1.

102914371301234

dizi[1] ↔ dizi[0] → [10, 29, 14, 37, 13].

102914371301234ienKucuk

i = 1: dizi[1..4] taranır (3 karşılaştırma); en küçük 13, indis 4.

101314372901234

dizi[4] ↔ dizi[1] → [10, 13, 14, 37, 29].

101314372901234i/enKucuk

i = 2: dizi[2..4] taranır (2 karşılaştırma); en küçük 14, indis 2.

101314372901234

enKucuk == i: öğe kendisiyle takas edilir; dizi değişmez.

101314372901234ienKucuk

i = 3: dizi[3..4] taranır (1 karşılaştırma); en küçük 29, indis 4.

101314293701234

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?

başlangıç9837564101234567

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: gruplar9837564101234567

aralik = 4: gruplar [9, 5], [8, 6], [3, 4], [7, 1].

aralik = 4 sonrası5631984701234567

Her grup kendi içinde sıralandı (3 kaydırma) → [5, 6, 3, 1, 9, 8, 4, 7].

aralik = 2: gruplar5631984701234567

aralik = 2: gruplar [5, 3, 9, 4], [6, 1, 8, 7].

aralik = 2 sonrası3146579801234567

Her grup kendi içinde sıralandı (5 kaydırma) → [3, 1, 4, 6, 5, 7, 9, 8].

aralik = 1 sonrası1345678901234567

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:

  1. [0..1] → [27, 38]
  2. [2..3] → [3, 43]
  3. [0..3] → [3, 27, 38, 43]
  4. [4..5] → [9, 82]
  5. [4..6] → [9, 10, 82]
  6. [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?

çağrı [0..5]524713012345solsag

sol = 0, sag = 5 → orta = 2. Önce sol yarı [0..2] tamamen sıralanacak.

çağrı [0..2]524713012345solsag

[0..2]: orta = 1 → önce [0..1].

birlestir [0..1]254713012345solsag

[0..0] ve [1..1] tek öğeli (taban durum). birlestir(0, 0, 1) → [2, 5].

birlestir [0..2]245713012345solsag

[2..2] tek öğeli. birlestir(0, 1, 2): [2, 5] + [4] → [2, 4, 5]. Sol yarı bitti.

çağrı [3..5]245713012345solsag

Sağ yarı [3..5]: orta = 4 → önce [3..4].

birlestir [3..4]245173012345solsag

birlestir(3, 3, 4): [7] + [1] → [1, 7].

birlestir [3..5]245137012345solsag

birlestir(3, 4, 5): [1, 7] + [3] → [1, 3, 7].

birlestir [0..5]123457012345solsag

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?

7216853401234567j

pivot = dizi[7] = 4 (koyu); i = −1: ≤ pivot bölgesi (mavi) boş. Kırmızı: > pivot, beyaz: henüz bakılmadı.

7216853401234567j

j = 0: 7 > 4 → yalnızca j ilerler; kırmızı bölge büyür.

2716853401234567ij

j = 1: 2 ≤ 4 → i = 0; takas(dizi, 0, 1) → [2, 7, 1, 6, 8, 5, 3, 4].

2176853401234567ij

j = 2: 1 ≤ 4 → i = 1; takas(dizi, 1, 2) → [2, 1, 7, 6, 8, 5, 3, 4].

2176853401234567ij

j = 3: 6 > 4 → yalnızca j ilerler; kırmızı bölge büyür.

2176853401234567ij

j = 4: 8 > 4 → yalnızca j ilerler; kırmızı bölge büyür.

2176853401234567ij

j = 5: 5 > 4 → yalnızca j ilerler; kırmızı bölge büyür.

2136857401234567i

j = 6: 3 ≤ 4 → i = 2; takas(dizi, 2, 6) → [2, 1, 3, 6, 8, 5, 7, 4].

2134857601234567pivot

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.

3251467801234567p

Ç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?

2741865

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.

2761845

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].

2861745

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].

8261745

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].

8761245

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.

7561248

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.

945132

Ç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ı).

adet1220201234önek1355701234

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?

dizi314130012345sayac1202101234cikti012345

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.

dizi314130012345sayac1335601234cikti012345

Önek toplamı: sayac[x] = anahtarı ≤ x olan öğe sayısı → [1, 3, 3, 5, 6]. sayac[x] − 1, x'in çıktıdaki son konumudur.

dizi314130012345sayac0335601234cikti0012345

i = 5: dizi[5] = 0 → cikti[sayac[0] − 1] = cikti[0] = 0; sayac[0] = 0.

dizi314130012345sayac0334601234cikti03012345

i = 4: dizi[4] = 3 → cikti[sayac[3] − 1] = cikti[4] = 3; sayac[3] = 4.

dizi314130012345sayac0234601234cikti013012345

i = 3: dizi[3] = 1 → cikti[sayac[1] − 1] = cikti[2] = 1; sayac[1] = 2.

dizi314130012345sayac0234501234cikti0134012345

i = 2: dizi[2] = 4 → cikti[sayac[4] − 1] = cikti[5] = 4; sayac[4] = 5.

dizi314130012345sayac0134501234cikti01134012345

i = 1: dizi[1] = 1 → cikti[sayac[1] − 1] = cikti[1] = 1; sayac[1] = 1.

dizi314130012345sayac0133501234cikti011334012345

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şAnahtarDizi
1birler[720, 355, 436, 457, 657, 329, 839]
2onlar[720, 329, 436, 839, 355, 457, 657]
3yü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.

Son

Bölüm 2: Sıralama Algoritmaları: Çalışma Soruları
Konu anlatımı: Bölüm 2: Sıralama Algoritmaları sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.