Bölüm 1.3: Algoritmalar
Giriş
Öğrenme Çıktıları
Bir problemi girdi, çıktı ve test senaryolarıyla tanımlamak; çözümü önce algoritma, sonra kod olarak yazmak.
Algoritmayı sözde kodla (pseudocode) ifade etmek ve değişken tablosuyla adım adım elle izlemek.
Okuma, yazma, karar ve döngü adımlarını Java karşılıklarına çevirmek.
Sıralı yazdırma, faktöriyel, Fibonacci, palindrom, asal sayı ve üs alma algoritmalarını yazmak ve test etmek.
Rastgele, doğrusal ve ikili aramayı karşılaştırmak; ikili aramanın neden sıralı veri gerektirdiğini açıklamak.
Rastgele (karıştırma), seçimli sıralamayı ve kabarcık sıralamasını bir dizi üzerinde adım adım uygulamak.
Problem Çözme
Önce Algoritma, Sonra Uygulama
- Adım 1: Sorunu net bir şekilde tanımlamak başarının anahtarıdır: ne verilecek, ne istenecek?
- Adım 2: Algoritma, sorunu çözmek için adım adım yönergeler sunar. Doğru algoritmayı seçmek programın verimli çalışmasını sağlar.
- Adım 3: Algoritma belirlendikten sonra seçilen programlama dilinde (bizim için Java) kodlama yapılır.
- Adım 4: Test senaryoları ile program doğrulanır, hatalar bulunur ve gerekirse önceki adımlara dönülür.
Problem Çözme
Algoritma (Algorithm) Nedir?
Algoritma: Bir problemi çözmek için izlenen, sırası belli, açık ve sonlu sayıda adımdan oluşan yönergeler dizisidir.
- Sözcük, 9. yüzyılda yaşamış matematikçi el-Hârizmî'nin adının Latince yazılışından gelir.
- Bilgisayar algoritmayı anlamaz; algoritmayı bir programlama diline çevirdiğimizde çalıştırır.
- Aynı problemi çözen birden çok algoritma olabilir; bunlar hız ve bellek bakımından karşılaştırılır.
Sıfır veya daha fazla başlangıç verisi.
En az bir sonuç üretir.
Her adım açık ve tek anlamlıdır.
Sonlu sayıda adımda biter.
Her adım gerçekten yapılabilir.
Problem Çözme
Sorunu Tanımlama
- Programın girdi ve çıktıları doğal bir dilde (Türkçe) açıklanır.
- Programın doğru çalıştığını doğrulamak için test senaryoları (test cases) oluşturulur: verilen girdi için beklenen çıktı önceden yazılır.
Sorun: İki sayının toplamını hesaplamak
| Test | Girdi | Beklenen çıktı |
|---|---|---|
| 1 | 3, 5 | 8 |
| 2 | −2, 7 | 5 |
| 3 (sınır) | 0, 0 | 0 |
Sorun: Bir metindeki kelime sayısını bulmak
| Test | Girdi | Beklenen çıktı |
|---|---|---|
| 1 | "Merhaba, dünya!" | 2 |
| 2 | "Bu bir denemedir." | 3 |
| 3 (sınır) | "" (boş metin) | 0 |
Üçüncü satırlar sınır durumlardır (edge case): sıfır, boş metin, negatif sayı gibi uç girdiler hataların en sık saklandığı yerlerdir.
Problem Çözme
Algoritma Belirleme ve Test Etme
Sorunu mantıklı bir şekilde çözmek için gerekli adımlar sırayla belirlenir.
Sorun: İki sayının toplamını hesaplama.
Algoritma:
- İlk sayıyı al.
- İkinci sayıyı al.
- İki sayıyı topla.
- Toplamı ekrana yazdır.
Algoritma oluşturulduktan sonraki adım test etmektir:
- Küçük ama anlamlı test senaryoları seçilir.
- Algoritma kâğıt üzerinde adım adım çalıştırılır ve her adımın sonucu bir değişken tablosuna yazılır (elle izleme, dry run).
Test 1 (girdi 3, 5) için elle izleme: ekrana 8 yazıldı, beklenen de 8
| Adım | sayı1 | sayı2 | toplam | Ekran |
|---|---|---|---|---|
| 1. İlk sayıyı al | 3 | |||
| 2. İkinci sayıyı al | 3 | 5 | ||
| 3. İki sayıyı topla | 3 | 5 | 8 | |
| 4. Toplamı yazdır | 3 | 5 | 8 | 8 |
Problem Çözme
Algoritmayı İfade Etmek: Sözde Kod (Pseudocode)
Algoritma doğal dille, sözde kodla, akış diyagramıyla veya doğrudan bir programlama diliyle yazılabilir. Sözde kod, programlama diline benzeyen ama derleyici kuralları olmayan, insan için yazılmış bir gösterimdir; mantık hatalarını kodlamadan önce bulmayı ve programcılar arası işbirliğini kolaylaştırır.
| Sözde kod | Anlamı | Java karşılığı |
|---|---|---|
Başla … Bitir | Algoritmanın başı ve sonu | main metodunun { … } gövdesi |
Oku x | Kullanıcıdan değer al | x = tarayici.nextInt(); |
Yaz "…", x | Ekrana yazdır | System.out.println("…" + x); |
x = 5 | Değişkene değer ata | x = 5; |
Eğer x = y ise | Eşitliği karşılaştır | if (x == y) (iki eşittir!) |
Değilse | Koşul yanlışsa | else |
Döngü i = 1'den n'e kadar | Tekrarla | for (int i = 1; i <= n; i++) |
Döngüyü Kır | Döngüden hemen çık | break; |
%, ve, veya | Kalan, mantıksal ve/veya | %, &&, || |
Koda Dönüştürme
Koda Dönüştürme (Implementation)
- Algoritmayı oluşturduktan sonraki adım kodlamadır.
- Programlama dili, algoritmayı bilgisayarın anlayacağı (derlenip çalıştırılabilecek) şekilde ifade eder.
- Bir programı yönetilebilir ve anlaşılır hale getirmek için kod mantıksal parçalara ayrılır: girdi alma, hesaplama, çıktı verme; daha büyük programlarda fonksiyonlar.
- Sözde koddaki her satır genellikle bir veya birkaç Java satırına karşılık gelir.
| Algoritma adımı | Java |
|---|---|
| İlk sayıyı al | sayi1 = tarayici.nextDouble(); |
| İkinci sayıyı al | sayi2 = tarayici.nextDouble(); |
| İki sayıyı topla | toplam = sayi1 + sayi2; |
| Toplamı yazdır | System.out.println(toplam); |
Amaç, algoritma adımı ile kod satırı arasındaki eşleşmeyi görmektir. Kütüphaneler çoğunlukla İngilizce adlar kullanır; bu derste kendi adlarımız Türkçe ama Türkçe karakter kullanılmadan seçilir.
Koda Dönüştürme · Adım adım kod izleme
Toplama Programının Adım Adım İzlenmesi
Klavyeden okumak için bir Scanner nesnesi oluşturulur; henüz hiçbir sayı yok.
print mesajı yazar ama alt satıra geçmez; imleç mesajın hemen yanında bekler.
Kullanıcı 3 yazıp Enter'a basar; nextDouble() bunu 3.0 olarak okur ve sayi1'e koyar.
İkinci mesaj yazılır.
Kullanıcı 5 girer; sayi2 = 5.0.
Sağ taraf önce hesaplanır: 3.0 + 5.0 = 8.0; sonuç toplam'a atanır.
+ metinleri birleştirir; sayılar metne çevrilerek tek satır oluşur.
Tarayıcı kapatılır, program biter. Çıktı test senaryosundaki beklenen 8 ile uyuşuyor.
Scanner tarayici = new Scanner(System.in); System.out.print("Birinci sayıyı giriniz: "); double sayi1 = tarayici.nextDouble(); System.out.print("İkinci sayıyı giriniz: "); double sayi2 = tarayici.nextDouble(); double toplam = sayi1 + sayi2; System.out.println(sayi1 + " ile " + sayi2 + " toplamı: " + toplam); tarayici.close();
Örnek Algoritmalar
Örnek Algoritmalar
Her algoritma için: sorun tanımı → sözde kod → değişken tablosuyla elle izleme → Java kodu ve test.
Karar yapısı: Eğer … Değilse
İç içe kararlar, ve bağlacı
Döngü ve biriktirici değişken
Döngüde değişkenleri kaydırma
Metni temizleme, ters çevirme, karşılaştırma
Bayrak (flag) ve döngüyü kırma
Tekrarlı çarpma
Bölümün ikinci yarısında: rastgele, doğrusal, ikili arama; karıştırma, seçimli sıralama, kabarcık sıralaması.
Örnek Algoritmalar
İki Tam Sayıyı Küçükten Büyüğe Yazdırma
Başla Yaz "Birinci tamsayıyı girin: " Oku birinciTamsayı Yaz "İkinci tamsayıyı girin: " Oku ikinciTamsayı Eğer birinciTamsayı < ikinciTamsayı ise Yaz birinciTamsayı, " ", ikinciTamsayı Değilse Yaz ikinciTamsayı, " ", birinciTamsayı Eğer Sonu Bitir
Sorun tanımı
Girdi: iki tam sayı. Çıktı: aynı sayılar, küçük olan önce.
| Girdi | Beklenen |
|---|---|
| 4, 11 | 4 11 |
| 13, 11 | 11 13 |
| 7, 7 | 7 7 |
Sayılar eşitse koşul yanlış olur ve Değilse kolu çalışır; iki sayı aynı olduğu için çıktı yine doğrudur.
Örnek Algoritmalar · Adım adım izle
İki Tam Sayı: Elle İzleme (4, 11) ve (13, 11)
Kullanıcıdan birinci sayı istenir.
Kullanıcı 4 girer; değer birinciTamsayı kutusuna yazılır.
İkinci sayı istenir; kullanıcı 11 girer.
Koşul: 4 < 11 → doğru.
Koşul doğru olduğu için ise kolu çalışır: önce birinci, sonra ikinci yazılır.
Algoritma biter. Çıktı 4 11, beklenenle aynı.
İkinci test: algoritma 13 ve 11 girdileriyle yeniden çalıştırılıyor.
Kullanıcı 13 girer; değer birinciTamsayı kutusuna yazılır.
İkinci sayı istenir; kullanıcı 11 girer.
Koşul: 13 < 11 → yanlış.
Koşul yanlış: Değilse koluna geçilir.
Önce ikinci (küçük olan), sonra birinci yazılır.
Algoritma biter. Çıktı 11 13, beklenenle aynı.
Başla Yaz "Birinci tamsayıyı girin: " Oku birinciTamsayı Yaz "İkinci tamsayıyı girin: " Oku ikinciTamsayı Eğer birinciTamsayı < ikinciTamsayı ise Yaz birinciTamsayı, " ", ikinciTamsayı Değilse Yaz ikinciTamsayı, " ", birinciTamsayı Eğer Sonu Bitir
Örnek Algoritmalar
Üç Tam Sayıyı Küçükten Büyüğe Yazdırma
Başla // İlk tamsayıyı kullanıcıdan al Yaz "Birinci tamsayıyı girin: " Oku birinciTamsayı // İkinci tamsayıyı kullanıcıdan al Yaz "İkinci tamsayıyı girin: " Oku ikinciTamsayı // Üçüncü tamsayıyı kullanıcıdan al Yaz "Üçüncü tamsayıyı girin: " Oku üçüncüTamsayı // Küçükten büyüğe sırala ve yazdır Eğer birinciTamsayı ≤ ikinciTamsayı ve birinciTamsayı ≤ üçüncüTamsayı ise Yaz birinciTamsayı Eğer ikinciTamsayı ≤ üçüncüTamsayı ise Yaz ikinciTamsayı, " ", üçüncüTamsayı Değilse Yaz üçüncüTamsayı, " ", ikinciTamsayı Eğer Sonu
Değilse Eğer ikinciTamsayı ≤ birinciTamsayı ve ikinciTamsayı ≤ üçüncüTamsayı ise Yaz ikinciTamsayı Eğer birinciTamsayı ≤ üçüncüTamsayı ise Yaz birinciTamsayı, " ", üçüncüTamsayı Değilse Yaz üçüncüTamsayı, " ", birinciTamsayı Eğer Sonu Değilse Yaz üçüncüTamsayı Eğer birinciTamsayı ≤ ikinciTamsayı ise Yaz birinciTamsayı, " ", ikinciTamsayı Değilse Yaz ikinciTamsayı, " ", birinciTamsayı Eğer Sonu Eğer Sonu Bitir
Fikir: önce en küçüğü bul ve yaz; kalan iki sayıyı iki tam sayı algoritmasıyla sırala. Aynı küçük algoritma üç kez kullanılıyor: bir fonksiyon olmaya çok uygun.
Örnek Algoritmalar
Üç Tam Sayı: Java Kodu ve Testler
import java.util.Scanner; public class UcSayiSirala { public static void main(String[] args) { Scanner tarayici = new Scanner(System.in); System.out.print("Üç tamsayı girin: "); int birinci = tarayici.nextInt(); int ikinci = tarayici.nextInt(); int ucuncu = tarayici.nextInt(); if (birinci <= ikinci && birinci <= ucuncu) { System.out.print(birinci + " "); if (ikinci <= ucuncu) System.out.println(ikinci + " " + ucuncu); else System.out.println(ucuncu + " " + ikinci); } else if (ikinci <= birinci && ikinci <= ucuncu) { System.out.print(ikinci + " "); if (birinci <= ucuncu) System.out.println(birinci + " " + ucuncu); else System.out.println(ucuncu + " " + birinci); } else { System.out.print(ucuncu + " "); if (birinci <= ikinci) System.out.println(birinci + " " + ikinci); else System.out.println(ikinci + " " + birinci); } tarayici.close(); } }
Testler: 3! = 6 farklı sıranın hepsi (1 2 3, 1 3 2, 2 1 3, 2 3 1, 3 1 2, 3 2 1) → 1 2 3; eşit sayılar 5 5 2 → 2 5 5.
Örnek Algoritmalar · Adım adım kod izleme
Üç Tam Sayı: Java Kodunun İzlenmesi (7, 3, 5)
Girdi 7, 3, 5. İlk koşul: 7 ≤ 3 yanlış; &&'nin sağ tarafına bakılmaz bile.
İkinci koşul: 3 ≤ 7 doğru ve 3 ≤ 5 doğru → en küçük ikinci.
En küçük sayı yazılır; print satır sonu eklemez.
Kalan iki sayı karşılaştırılır: 7 ≤ 5 yanlış.
else kolu: önce 5, sonra 7 yazılır. Çıktı 3 5 7.
if (birinci <= ikinci && birinci <= ucuncu) { System.out.print(birinci + " "); if (ikinci <= ucuncu) System.out.println(ikinci + " " + ucuncu); else System.out.println(ucuncu + " " + ikinci); } else if (ikinci <= birinci && ikinci <= ucuncu) { System.out.print(ikinci + " "); if (birinci <= ucuncu) System.out.println(birinci + " " + ucuncu); else System.out.println(ucuncu + " " + birinci); } else { System.out.print(ucuncu + " "); if (birinci <= ikinci) System.out.println(birinci + " " + ikinci); else System.out.println(ikinci + " " + birinci); }
Örnek Algoritmalar
Faktöriyel Bulma
Başla // Bir sayıyı gir Oku sayı // Sonucu saklamak için bir değişkeni başlat faktoriyel = 1 // Faktöriyel hesabı için döngü Döngü i = 1'den başlayarak sayı'ya kadar faktoriyel = faktoriyel * i Döngü Sonu Yaz "Girilen sayının faktöriyeli: ", faktoriyel Bitir
Tanım: n! = 1 × 2 × 3 × … × n, ayrıca 0! = 1.
| n | n! |
|---|---|
| 0 | 1 |
| 1 | 1 |
| 3 | 6 |
| 5 | 120 |
| 10 | 3 628 800 |
faktoriyel bir biriktiricidir (accumulator): çarpmanın etkisiz elemanı olan 1 ile başlatılır. 0 ile başlatılsaydı sonuç hep 0 olurdu.
Örnek Algoritmalar · Adım adım izle
Faktöriyel: Elle İzleme (sayı = 5)
Kullanıcı 5 girer.
Biriktirici 1 ile başlatılır.
Döngü: i = 1 (i ≤ 5 olduğu için gövde çalışır).
faktoriyel = 1 × 1 = 1.
Döngü: i = 2 (i ≤ 5 olduğu için gövde çalışır).
faktoriyel = 1 × 2 = 2.
Döngü: i = 3 (i ≤ 5 olduğu için gövde çalışır).
faktoriyel = 2 × 3 = 6.
Döngü: i = 4 (i ≤ 5 olduğu için gövde çalışır).
faktoriyel = 6 × 4 = 24.
Döngü: i = 5 (i ≤ 5 olduğu için gövde çalışır).
faktoriyel = 24 × 5 = 120.
i = 6 olur; 6 ≤ 5 yanlış olduğu için döngü biter.
Sonuç yazdırılır: 5! = 120.
Başla Oku sayı faktoriyel = 1 Döngü i = 1'den başlayarak sayı'ya kadar faktoriyel = faktoriyel * i Döngü Sonu Yaz "Girilen sayının faktöriyeli: ", faktoriyel Bitir
Örnek Algoritmalar
Fibonacci Serisi Bulma
Başla // Kaç terim istendiğini gir Oku n // İlk iki Fibonacci sayısını başlat a = 0 b = 1 Eğer n ≥ 1 ise Yaz a Eğer n ≥ 2 ise Yaz b // Kalan terimleri hesapla Döngü i = 2'den başlayarak n − 1'e kadar sonuc = a + b a = b b = sonuc Yaz sonuc Döngü Sonu Bitir
Tanım: İlk iki terim 0 ve 1; sonraki her terim önceki ikisinin toplamıdır.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
| n (terim sayısı) | Beklenen çıktı |
|---|---|
| 1 | 0 |
| 2 | 0 1 |
| 5 | 0 1 1 2 3 |
| 7 | 0 1 1 2 3 5 8 |
Döngü i = 2 … n − 1 arasında n − 2 kez döner; ilk iki terim döngüden önce yazılır. a = b ve b = sonuc satırları değerleri bir adım "kaydırır".
Örnek Algoritmalar · Adım adım izle
Fibonacci: Elle İzleme (n = 5)
Kullanıcı n = 5 girer: ilk 5 terim istenir.
İlk iki terim: a = 0, b = 1.
5 ≥ 1: a yazılır.
5 ≥ 2: b yazılır.
Döngü: i = 2 (i ≤ n − 1 = 4).
sonuc = a + b = 0 + 1 = 1.
a = b → a = 1 (bir adım ileri kaydı).
b = sonuc → b = 1.
Yeni terim yazılır: 1.
Döngü: i = 3 (i ≤ n − 1 = 4).
sonuc = a + b = 1 + 1 = 2.
a = b → a = 1 (bir adım ileri kaydı).
b = sonuc → b = 2.
Yeni terim yazılır: 2.
Döngü: i = 4 (i ≤ n − 1 = 4).
sonuc = a + b = 1 + 2 = 3.
a = b → a = 2 (bir adım ileri kaydı).
b = sonuc → b = 3.
Yeni terim yazılır: 3.
i = 5 olur; 5 ≤ 4 yanlış, döngü biter. Tam 5 terim yazıldı: 0 1 1 2 3.
Başla Oku n a = 0 b = 1 Eğer n ≥ 1 ise Yaz a Eğer n ≥ 2 ise Yaz b Döngü i = 2'den başlayarak n − 1'e kadar sonuc = a + b a = b b = sonuc Yaz sonuc Döngü Sonu Bitir
Örnek Algoritmalar
Palindrom Kontrolü
Başla // Bir kelime veya cümlenin girilmesini iste Oku girdiMetin // Girdiyi temizle: küçük harf, boşluk ve noktalama yok temizMetin = Temizle(girdiMetin) // Temizlenmiş girdiyi ters çevir tersGirdi = TersÇevir(temizMetin) // Temizlenmiş girdi ile ters girdiyi karşılaştır Eğer temizMetin = tersGirdi ise Yaz "Girilen metin bir palindromdur." Değilse Yaz "Girilen metin bir palindrom değildir." Eğer Sonu Bitir
Palindrom: Tersten okunuşu düz okunuşuyla aynı olan kelime veya cümle: kayak, abcba, "Ey Edip Adana'da pide ye". Cümlelerde büyük/küçük harf, boşluk ve noktalama dikkate alınmaz; bu yüzden karşılaştırmadan önce metin temizlenir.
| Girdi | Beklenen |
|---|---|
| abcba | palindrom |
| Kayak | palindrom |
| Kitap | değil |
Örnek Algoritmalar · Adım adım izle
Palindrom: Elle İzleme (abcba ve Kitap)
Kullanıcı abcba girer.
Temizleme: küçük harfe çevrilir (değişiklik yok).
Temiz metin sondan başa okunur: abcba.
Karşılaştırma harf harf: bütün harfler eşleşti → doğru.
Koşul doğru: palindrom mesajı yazılır.
İkinci test: Kullanıcı Kitap girer.
Temizleme: küçük harfe çevrilir ("Kitap" → "kitap").
Temiz metin sondan başa okunur: patik.
Karşılaştırma harf harf: kitap ≠ patik → yanlış.
Koşul yanlış: Değilse kolu çalışır.
Başla Oku girdiMetin temizMetin = Temizle(girdiMetin) tersGirdi = TersÇevir(temizMetin) Eğer temizMetin = tersGirdi ise Yaz "Girilen metin bir palindromdur." Değilse Yaz "Girilen metin bir palindrom değildir." Eğer Sonu Bitir
Örnek Algoritmalar
Asal Sayı Kontrolü
Başla // Bir sayıyı gir Oku sayı // Bayrak (flag): 0 ve 1 asal değildir Eğer sayı < 2 ise asalMi = False Değilse asalMi = True // 2'den sayının yarısına kadar bölenleri dene Döngü bölen = 2'den başlayarak sayı / 2'ye kadar Eğer sayı % bölen = 0 ise // Bölünüyorsa sayı asal değildir asalMi = False Döngüyü Kır Eğer Sonu Döngü Sonu // Bayrağa göre sonucu yazdır Eğer asalMi = True ise Yaz sayı, " bir asal sayıdır." Değilse Yaz sayı, " bir asal sayı değildir." Eğer Sonu Bitir
Asal sayı: 1'den büyük olup yalnızca 1'e ve kendisine bölünebilen sayı: 2, 3, 5, 7, 11, …
- Bayrak (flag): başta "asal" varsayılır; bir bölen bulunursa bayrak indirilir.
%kalanı verir: 21 % 3 = 0 → tam bölünüyor.- Bir bölen bulununca devam etmeye gerek yoktur: Döngüyü Kır.
- Sayının yarısından büyük bir sayı (kendisi hariç) onu bölemez;
sayı / 2tam sayı bölmesidir (7 / 2 = 3). - 1 ve 0 için döngü hiç çalışmaz; bu yüzden ayrıca kontrol edilir.
Örnek Algoritmalar · Adım adım izle
Asal Sayı: Elle İzleme (7 ve 21)
Kullanıcı 7 girer.
7 ≥ 2 olduğu için bayrak True ile başlar.
Döngü: bölen = 2 (≤ 7 / 2 = 3).
7 % 2 = 1 ≠ 0 → bölünmüyor, devam.
Döngü: bölen = 3 (≤ 7 / 2 = 3).
7 % 3 = 1 ≠ 0 → bölünmüyor, devam.
bölen = 4 olur; 4 ≤ 3 yanlış, döngü biter. Hiç bölen bulunmadı.
Bayrak True: 7 asaldır.
İkinci test: Kullanıcı 21 girer.
21 ≥ 2 olduğu için bayrak True ile başlar.
Döngü: bölen = 2 (≤ 21 / 2 = 10).
21 % 2 = 1 ≠ 0 → bölünmüyor, devam.
Döngü: bölen = 3 (≤ 21 / 2 = 10).
21 % 3 = 0 → tam bölünüyor!
Bayrak indirilir: asalMi = False.
Döngüyü Kır: kalan bölenler denenmez.
Bayrak False: Değilse kolu çalışır.
Başla Oku sayı Eğer sayı < 2 ise asalMi = False Değilse asalMi = True Döngü bölen = 2'den başlayarak sayı / 2'ye kadar Eğer sayı % bölen = 0 ise asalMi = False Döngüyü Kır Eğer Sonu Döngü Sonu Eğer asalMi = True ise Yaz sayı, " bir asal sayıdır." Değilse Yaz sayı, " bir asal sayı değildir." Eğer Sonu Bitir
Örnek Algoritmalar
Üs Alma
Başla // Bir sayıyı gir Oku taban // Bir üssü gir Oku üs // Sonucu saklamak için bir değişkeni başlat sonuc = 1 // Üssü kullanarak sonucu hesapla Döngü i = 1'den başlayarak üs'e kadar sonuc = sonuc * taban Döngü Sonu Yaz "Sonuç: ", sonuc Bitir
Tanım: tabanüs = taban × taban × … × taban (üs kez); taban0 = 1.
| taban | üs | Beklenen |
|---|---|---|
| 3 | 4 | 81 |
| 2 | 10 | 1024 |
| 5 | 0 | 1 |
Faktöriyelle aynı kalıp: biriktirici 1 ile başlar, döngü her turda bir çarpma yapar. Farkı, hep aynı sayıyla (taban) çarpmasıdır. Üs 0 ise döngü hiç çalışmaz ve sonuç 1 kalır.
Örnek Algoritmalar · Adım adım izle
Üs Alma: Elle İzleme (34)
Kullanıcı taban = 3 girer.
Kullanıcı üs = 4 girer: 34 hesaplanacak.
Biriktirici 1 ile başlar.
Döngü: i = 1.
sonuc = 1 × 3 = 3.
Döngü: i = 2.
sonuc = 3 × 3 = 9.
Döngü: i = 3.
sonuc = 9 × 3 = 27.
Döngü: i = 4.
sonuc = 27 × 3 = 81.
i = 5 > 4: döngü biter.
Sonuç yazdırılır: 34 = 81.
Başla Oku taban Oku üs sonuc = 1 Döngü i = 1'den başlayarak üs'e kadar sonuc = sonuc * taban Döngü Sonu Yaz "Sonuç: ", sonuc Bitir
Arama Algoritmaları
Arama Algoritmaları
- Bir koleksiyon içerisinde belirli bir öğenin var olup olmadığını (ve varsa yerini) sorgular.
- Veri işlemek ve bilgi edinmek için kullanılan temel bir işlemdir.
- Belirli öğelerin hızlı ve doğru bir şekilde bulunmasına yardımcı olur.
- Kullanım alanları: kitapların kütüphanedeki yerini bulma, bir web sitesinde belirli bir sayfayı bulma, veri tabanında belirli bir kaydı arama, telefon rehberinde bir isim arama.
Girdi:
- Nesnelerin bir koleksiyonu, "Sepet" diyelim.
- Belirli bir nesne, "Elma" diyelim.
Çıktı:
- "Elma" sepetin içindeyse
true. - "Elma" sepetin içinde değilse
false.
Programlarda genellikle bulunan öğenin indisi (konumu), bulunamazsa -1 döndürülür.
Arama Algoritmaları
Üç Arama Yöntemi
Her adımda rastgele bir öğe seçip hedefle karşılaştırır.
Sıra gerekmez · bulma garantisi yok
Öğeleri baştan sona sırayla tek tek karşılaştırır.
Sıra gerekmez · en fazla n karşılaştırma
Ortadaki öğeye bakar, her adımda arama alanının yarısını eler.
Dizi sıralı olmalı · en fazla ≈ log₂ n karşılaştırma
Arama Algoritmaları
Rastgele Arama (Random Search)
- Koleksiyon içerisindeki öğeleri rastgele kontrol eder: her adımda rastgele bir öğe seçer.
- Hedefi bulana veya deneme hakkı tükenene kadar çalışır.
- Sözde kod:
- Rastgele bir öğe seç.
- Seçilen öğeyi hedefle karşılaştır.
- Hedef bulunduysa işlemi sonlandır.
- Bulunamadıysa adımları tekrarla.
Avantajlar
- Basittir.
- Verinin sırası önemli değildir.
Dezavantajlar
- Her zaman etkili bir çözüm sağlamaz: aynı öğeyi tekrar tekrar seçebilir.
- Bulma olasılığını artırabilir ama kesin bir sonuç garantisi vermez.
- Hedef yoksa sonsuza kadar sürer; deneme sınırı gerekir.
- En kötü durumda bütün koleksiyonu (hatta fazlasını) taramak gerekir.
Arama Algoritmaları · Adım adım
Rastgele Arama: Adım Adım
Elimizde sırasız bir dizi var; aranan öğe 48.
Adım 1: rastgele seçilen öğe 23; 23 ≠ 48, henüz bulunamadı. Yeni bir rastgele öğe seçilir.
Adım 2: rastgele seçilen öğe 42; 42 ≠ 48, henüz bulunamadı. Yeni bir rastgele öğe seçilir.
Adım 3: rastgele seçilen öğe 7; 7 ≠ 48, henüz bulunamadı. Yeni bir rastgele öğe seçilir.
Adım 4: rastgele seçilen öğe 48 → aranan öğe bulundu; arama biter (4 deneme).
Arama Algoritmaları
Doğrusal Arama (Linear Search)
- Koleksiyon içinde bir öğeyi bulmanın en temel yoludur.
- Öğeleri sırayla kontrol ederek aranan öğeyi bulmaya çalışır.
- Öğelerin sıralı olması gerekmez.
- Küçük koleksiyonlarda etkili bir çözümdür.
Adımlar:
- Öğeleri bir listeye (diziye) koy.
- İlk öğeden başlayarak sırayla hedef öğe ile karşılaştır.
- Hedef bulunursa işlemi sonlandır ve konumunu döndür.
- Bulunmazsa bir sonraki öğeye geç.
- Listenin sonuna kadar devam et; sona gelindiyse öğe yoktur.
Avantajlar
- Basit ve anlaşılır.
- Herhangi bir sırayla (sırasız veride) çalışır.
- Sonuç kesindir: öğe varsa mutlaka bulunur.
Dezavantajlar
- Büyük koleksiyonlarda yavaştır: her öğeyi kontrol etmesi gerekebilir (en kötü n karşılaştırma).
Arama Algoritmaları · Adım adım
Doğrusal Arama: Adım Adım
Adım 1: aranan öğe 23. Dizinin ilk öğesinden (42) başlanır ve aranan öğe ile karşılaştırılır.
Adım 2: ilk öğe (42) aranan öğe (23) ile eşleşmez. Bir sonraki öğeye geçilir: 17.
Adım 3: ikinci öğe (17) de eşleşmez. Bir sonraki öğe: 8.
Adım 4: üçüncü öğe (8) de eşleşmez. Bir sonraki öğe: 23.
Adım 5: dördüncü öğe (23) aranan öğe ile eşleşir; arama bu adımda biter (4 karşılaştırma).
Arama Algoritmaları
İkili Arama (Binary Search)
- Bir koleksiyondaki öğeyi bulmanın hızlı ve etkili bir yoludur.
- Sıralı veriler (küçükten büyüğe veya büyükten küçüğe) üzerinde çalışır.
- Her adımda listenin yarısını eler.
- Büyük veri koleksiyonlarında arama için idealdir.
Adımlar:
- Ortadaki öğeyi seç ve hedefle karşılaştır.
- Hedef bulunursa işlemi sonlandır.
- Hedef ortadakinden küçükse sol yarıya odaklan.
- Hedef ortadakinden büyükse sağ yarıya odaklan.
- Hedef bulunana veya arama alanı tükenene kadar tekrarla.
Avantajlar
- Hızlıdır: 1 000 000 öğede en fazla 20 karşılaştırma.
- Büyük veri koleksiyonlarında çok etkilidir.
Dezavantajlar
- Veriler sıralı olmalıdır (sıralamanın da bir maliyeti vardır).
- Sırasız dizide yanlış sonuç verebilir (hata vermeden!).
Arama Algoritmaları · Adım adım
İkili Arama: Adım Adım
Elimizde sıralı bir dizi var; aranan öğe 48. Arama alanı başta bütün dizi: alt = 0, üst = 8.
Adım 1: dizinin ortasındaki öğe (42) alınır ve aranan öğe (48) ile karşılaştırılır.
Adım 2: 48, ortadaki öğeden (42) büyüktür; aranan öğe sağ yarıdadır. Sol yarı artık kullanılmaz: [48, 55, 64, 77].
Adım 3: sağ yarının ortası alınır. 4 öğe olduğu için iki orta vardır (55 ve 64); (alt + üst) / 2 soldakini, 55'i seçer.
Adım 4: 48, ortadaki öğeden (55) küçüktür; sağ taraf elenir. Geriye yalnızca [48] kalır.
Adım 5: ortadaki öğe 48, aranan öğeye eşittir: bulundu. 9 öğeli dizide yalnızca 3 karşılaştırma yapıldı.
Arama Algoritmaları
İkili Arama ve Doğrusal Arama: Karşılaştırma
- Öğeleri tek tek, sırayla kontrol eder.
- Hedefi bulana ya da liste bitene dek sürer.
- Veri sırasız olabilir.
- Büyük koleksiyonlarda yavaş olabilir.
- Sıralı verilerde hedefi hızlıca bulur.
- Veri sıralı olmalı (artan ya da azalan).
- Her adımda kalan listenin yarısını eler.
- Büyük koleksiyonlarda çok hızlıdır.
En kötü durumda karşılaştırma sayısı
| Öğe sayısı n | Doğrusal (n) | İkili (⌊log₂ n⌋ + 1) |
|---|---|---|
| 9 | 9 | 4 |
| 1 000 | 1 000 | 10 |
| 1 000 000 | 1 000 000 | 20 |
| 1 000 000 000 | 1 000 000 000 | 30 |
n iki katına çıkınca doğrusal aramanın işi ikiye katlanır, ikili aramanınki bir artar.
Arama Algoritmaları
Doğrusal ve İkili Arama: Etkileşimli Deney
Dizi sıralıdır, bu yüzden iki yöntem de doğru sonuç verir. Turuncu: incelenen öğe, kırmızı: elenen öğeler, yeşil: bulunan öğe. Farklı hedeflerde (ilk, son, olmayan bir sayı) karşılaştırma sayıları değişir.
Sıralama Algoritmaları
Sıralama Algoritmaları
- Veri koleksiyonundaki öğeleri belirli bir kurala göre düzenler.
- Genellikle öğeleri küçükten büyüğe (artan) veya büyükten küçüğe (azalan) sıralar.
- Veri analizi ve arama işlemleri için temel bir adımdır.
- Sıralı veriler arama işlemlerini hızlandırır: ikili arama yalnızca sıralı dizide çalışır.
Öğeleri rastgele karıştırır; sıralamayı garanti etmez.
En küçüğü seçip başa koyar.
Komşuları karşılaştırıp büyüğü sona taşır.
Daha hızlı yöntemler de vardır (birleştirmeli, hızlı sıralama); Java'nın hazır Arrays.sort metodu bunların geliştirilmiş biçimlerini kullanır.
Sıralama Algoritmaları
Rastgele Sıralama (Karıştırma, Shuffle)
- Bir veri koleksiyonunu rastgele bir düzene sokma işlemidir: öğeler rastgele karıştırılır.
- Verileri çeşitlendirmek ve analiz etmek için kullanılır: kart destesini karıştırma, sınav sorularının sırasını değiştirme, test verisi üretme.
- Bazı algoritmalar başlangıç verilerini rastgele karıştırarak (ör. hızlı sıralama) kötü durumlardan kaçınır.
Avantajlar
- Verileri rastgele düzenleyerek her seferinde farklı sonuçlar elde edilir.
- Java'da hazırdır:
Collections.shuffle(liste).
Dezavantajlar
- Verilerin doğru bir şekilde sıralanmasını sağlamaz.
- "Sıralanana kadar karıştır" yöntemi (bogosort) umutsuz derecede yavaştır: 10 öğenin 3 628 800 farklı dizilişinden yalnızca biri sıralıdır.
Sıralama Algoritmaları · Adım adım
Rastgele Sıralama: Adım Adım
Elimizde sıralanmamış bir dizi var: [42, 17, 8, 23, 31].
Adım 1: dizi öğeleri rastgele bir sırayla düzenlenir: [31, 17, 42, 8, 23]. Her düzenleme farklı bir sonuç üretir.
Adım 2: dizi öğeleri tekrar rastgele bir sırayla düzenlenir: [8, 23, 31, 42, 17].
Adım 3: dizi öğeleri tekrar rastgele bir sırayla düzenlenir: [8, 23, 17, 31, 42]. Sıraya yaklaştı ama hâlâ sıralı değil: karıştırma sıralamayı garanti etmez.
Sıralama Algoritmaları
Seçimli Sıralama (Selection Sort)
- Öğeleri karşılaştırarak sıralayan basit bir algoritmadır.
- En küçük (veya en büyük) öğeyi bulup sırayla yer değiştirerek çalışır.
Adımlar:
- Koleksiyondaki en küçük öğeyi bul.
- Bu öğeyi koleksiyonun başına taşı (ilk öğeyle yer değiştir).
- Geri kalan kısımdaki en küçük öğeyi bul.
- Onu ikinci pozisyona taşı.
- Bu adımları koleksiyonun sonuna kadar tekrarla.
Avantajlar
- Basit ve anlaşılır.
- Küçük veri koleksiyonlarında etkili.
- En fazla n − 1 yer değiştirme yapar.
Dezavantajlar
- Büyük veri koleksiyonlarında yavaştır: her zaman n(n − 1)/2 karşılaştırma yapar (dizi sıralı olsa bile).
Sıralama Algoritmaları · Adım adım
Seçimli Sıralama: Adım Adım
Elimizde sıralanmamış bir dizi var: [64, 25, 12, 22, 11, 36, 48].
Adım 1: sıralanmamış kısmın (indis 0–6) en küçüğü 11. 1. pozisyondaki 64 ile yer değiştirecek.
Dizi 1. adımdan sonra: [11, 25, 12, 22, 64, 36, 48]. Yeşil kısım artık sıralı ve yerinde.
Adım 2: sıralanmamış kısmın (indis 1–6) en küçüğü 12. 2. pozisyondaki 25 ile yer değiştirecek.
Dizi 2. adımdan sonra: [11, 12, 25, 22, 64, 36, 48]. Yeşil kısım artık sıralı ve yerinde.
Adım 3: sıralanmamış kısmın (indis 2–6) en küçüğü 22. 3. pozisyondaki 25 ile yer değiştirecek.
Dizi 3. adımdan sonra: [11, 12, 22, 25, 64, 36, 48]. Yeşil kısım artık sıralı ve yerinde.
Adım 4: sıralanmamış kısmın (indis 3–6) en küçüğü 25. Zaten yerinde: değişiklik yok.
Dizi 4. adımdan sonra: [11, 12, 22, 25, 64, 36, 48]. Yeşil kısım artık sıralı ve yerinde.
Adım 5: sıralanmamış kısmın (indis 4–6) en küçüğü 36. 5. pozisyondaki 64 ile yer değiştirecek.
Dizi 5. adımdan sonra: [11, 12, 22, 25, 36, 64, 48]. Yeşil kısım artık sıralı ve yerinde.
Adım 6: sıralanmamış kısmın (indis 5–6) en küçüğü 48. 6. pozisyondaki 64 ile yer değiştirecek.
Dizi 6. adımdan sonra: [11, 12, 22, 25, 36, 48, 64]. Yeşil kısım artık sıralı ve yerinde. Son öğe kendiliğinden yerine oturdu: 7 öğe için 6 adım yeterli.
Sıralama Algoritmaları
Kabarcık Sıralaması (Bubble Sort)
- Öğeleri sırayla karşılaştırarak sıralayan basit bir algoritmadır.
- Yan yana duran öğeleri karşılaştırır; büyük olanı, suyun yüzeyine çıkan bir kabarcık gibi sona doğru taşır.
Adımlar:
- Koleksiyonun başından başla.
- İki yan yana öğeyi karşılaştır; gerekiyorsa yer değiştirip büyük olanı sağa taşı.
- Koleksiyonun sonuna kadar bu adımı tekrarla (bir tur).
- En büyük öğe sona geldiği için son öğeyi sıralanmış kabul et.
- İlk dört adımı kalan kısım için tekrarla; bir turda hiç yer değiştirme olmazsa dur.
Avantajlar
- Basit ve anlaşılır.
- Küçük veya neredeyse sıralı koleksiyonlarda etkili (erken durma ile).
Dezavantajlar
- Büyük veri koleksiyonlarında çok yavaştır: en kötü durumda n(n − 1)/2 karşılaştırma ve aynı sayıda yer değiştirme.
Sıralama Algoritmaları · Adım adım
Kabarcık Sıralaması: Adım Adım
Elimizde sıralanmamış bir dizi var: [64, 25, 12, 22, 11, 36, 48].
Adım 1 (1. tur): 64 ve 25 karşılaştırılır; 64 > 25 olduğu için yer değiştirir → [25, 64, 12, 22, 11, 36, 48].
Adım 2 (1. tur): 64 ve 12 karşılaştırılır; 64 > 12 olduğu için yer değiştirir → [25, 12, 64, 22, 11, 36, 48].
Adım 3 (1. tur): 64 ve 22 karşılaştırılır; 64 > 22 olduğu için yer değiştirir → [25, 12, 22, 64, 11, 36, 48].
Adım 4 (1. tur): 64 ve 11 karşılaştırılır; 64 > 11 olduğu için yer değiştirir → [25, 12, 22, 11, 64, 36, 48].
Adım 5 (1. tur): 64 ve 36 karşılaştırılır; 64 > 36 olduğu için yer değiştirir → [25, 12, 22, 11, 36, 64, 48].
Adım 6 (1. tur): 64 ve 48 karşılaştırılır; 64 > 48 olduğu için yer değiştirir → [25, 12, 22, 11, 36, 48, 64].
Adım 7 (2. tur): 25 ve 12 karşılaştırılır; 25 > 12 olduğu için yer değiştirir → [12, 25, 22, 11, 36, 48, 64].
Adım 8 (2. tur): 25 ve 22 karşılaştırılır; 25 > 22 olduğu için yer değiştirir → [12, 22, 25, 11, 36, 48, 64].
Adım 9 (2. tur): 25 ve 11 karşılaştırılır; 25 > 11 olduğu için yer değiştirir → [12, 22, 11, 25, 36, 48, 64].
Adım 10 (2. tur): 25 ve 36 karşılaştırılır; 25 < 36, değişiklik yok.
Adım 11 (2. tur): 36 ve 48 karşılaştırılır; 36 < 48, değişiklik yok.
Adım 12 (3. tur): 12 ve 22 karşılaştırılır; 12 < 22, değişiklik yok.
Adım 13 (3. tur): 22 ve 11 karşılaştırılır; 22 > 11 olduğu için yer değiştirir → [12, 11, 22, 25, 36, 48, 64].
Adım 14 (3. tur): 22 ve 25 karşılaştırılır; 22 < 25, değişiklik yok.
Adım 15 (3. tur): 25 ve 36 karşılaştırılır; 25 < 36, değişiklik yok.
Adım 16 (4. tur): 12 ve 11 karşılaştırılır; 12 > 11 olduğu için yer değiştirir → [11, 12, 22, 25, 36, 48, 64].
Adım 17 (4. tur): 12 ve 22 karşılaştırılır; 12 < 22, değişiklik yok.
Adım 18 (4. tur): 22 ve 25 karşılaştırılır; 22 < 25, değişiklik yok.
Adım 19 (5. tur): 11 ve 12 karşılaştırılır; 11 < 12, değişiklik yok.
Adım 20 (5. tur): 12 ve 22 karşılaştırılır; 12 < 22, değişiklik yok.
5. turda hiç yer değiştirme olmadı: dizi sıralıdır, algoritma durur. Toplam 20 karşılaştırma, 11 yer değiştirme.
Sıralama Algoritmaları
Sıralama Yöntemlerinin Karşılaştırması
| Rastgele (karıştırma) | Seçimli | Kabarcık | |
|---|---|---|---|
| Fikir | Rastgele diziliş üret | En küçüğü seç, başa koy | Komşuları karşılaştır, büyüğü sona taşı |
| Sonuç sıralı mı? | Garanti yok | Evet | Evet |
| Karşılaştırma (n öğe) | — | her zaman n(n − 1)/2 | en kötü n(n − 1)/2, sıralı dizide n − 1 |
| Yer değiştirme | n − 1 | en fazla n − 1 | en kötü n(n − 1)/2 |
| Örnek dizi (n = 7) | — | 21 karşılaştırma, 5 gerçek takas | 20 karşılaştırma, 11 takas |
Sıralama Algoritmaları
Beş Sıralama Algoritmasının Karşılaştırması
| Algoritma | Fikir | Ortalama | En kötü | Not |
|---|---|---|---|---|
| Kabarcık (Bubble Sort) | komşu iki öğe karşılaştırılır, gerekirse yer değiştirir | O(n²) | O(n²) | basit; büyük verilerde etkisiz |
| Seçimli (Selection Sort) | en küçük bulunur, başa yerleşir; kalanla tekrarlanır | O(n²) | O(n²) | büyük verilerde yavaş |
| Eklemeli (Insertion Sort) | sıradaki öğe sıralı kısımda uygun yere eklenir | O(n²) | O(n²) | küçük veya neredeyse sıralı veride etkili |
| Birleştirmeli (Merge Sort) | ikiye böl, her yarıyı özyinelemeli sırala, birleştir | O(n log n) | O(n log n) | kararlı; büyük verilerde etkili |
| Hızlı (Quick Sort) | pivot seçilir, küçükler sola büyükler sağa (böl ve fethet) | O(n log n) | O(n²) | ortalamada çok hızlı |
Sıralama Algoritmaları
Seçimli ve Kabarcık Sıralaması: Etkileşimli Deney
Her "bir adım" tek bir karşılaştırma yapar. Turuncu: karşılaştırılan öğeler, yeşil: kesin yerine oturmuş öğeler. Aynı dizide iki yöntemin karşılaştırma ve takas sayıları kıyaslanabilir.
Özet
Özet
| Algoritma | Temel fikir | Kullanılan yapı | Örnek |
|---|---|---|---|
| İki / üç sayı sıralama | Karşılaştır, küçüğü önce yaz | Eğer … Değilse, iç içe karar | 13, 11 → 11 13 |
| Faktöriyel | 1'den n'e kadar çarp | Döngü + biriktirici (1 ile başlar) | 5! = 120 |
| Fibonacci | Her terim önceki ikisinin toplamı | Döngü + değişken kaydırma | 0 1 1 2 3 |
| Palindrom | Temizle, ters çevir, karşılaştır | Metin işlemleri, karar | kayak → evet |
| Asal sayı | 2 … n/2 arasında bölen ara | Bayrak + Döngüyü Kır | 21 → değil |
| Üs alma | Tabanı üs kez çarp | Döngü + biriktirici | 3⁴ = 81 |
| Rastgele / doğrusal / ikili arama | Rastgele dene / sırayla bak / yarıyı ele | Döngü, karar; ikilide sıralı dizi | 9 öğede en çok 4 karşılaştırma (ikili) |
| Karıştırma / seçimli / kabarcık | Rastgele diz / en küçüğü seç / komşuları değiştir | İç içe döngü, takas | n(n − 1)/2 karşılaştırma |
Her problemde aynı yol: sorunu ve testleri tanımla → sözde kod → elle izle → Java'ya çevir → testleri çalıştır.
Özet
Sık Yapılan Hatalar: Algoritma
faktoriyel = 0 ile başlanırsa her çarpım 0 olur. Toplama için 0, çarpma için 1 ile başlanır.-1 döner: hata mesajı yok, sonuç yanlış.a = b; b = a; iki değişkeni de b yapar. Önce gecici = a saklanmalı.Özet
Sık Yapılan Hatalar: Java
| Hata | Ne olur? |
|---|---|
import java.util.Scanner; unutuldu | Derleme hatası: error: cannot find symbol … symbol: class Scanner |
Satır sonunda ; yok: int toplam = 0 | Derleme hatası: error: ';' expected |
Karşılaştırmada tek =: if (sayi % bolen = 0) | Derleme hatası: error: unexpected type … required: variable, found: value. Eşitlik == ile sınanır. |
Metinleri == ile karşılaştırmak | Derlenir ama "abcba" ile tersi için false verir. girdi.equals(ters) kullanılmalı. |
i <= dizi.length ile döngü | Çalışma hatası: ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 |
13! için int kullanmak | Hata mesajı yok, sonuç yanlış: 1932053504 (doğrusu 6227020800). long kullanılmalı. |
Özet
Örnek Problemler
- Faktöriyel algoritmasını sayı = 4 için izleyin: her turda
ivefaktoriyeldeğerleri nedir? - Fibonacci algoritması n = 7 için ne yazdırır? Döngü kaç kez döner?
- Asal sayı algoritması 25 için kaç bölen dener ve ne yazdırır?
- [42, 17, 8, 23, 31] dizisinde doğrusal arama 31 ve 50 için kaç karşılaştırma yapar?
- [7, 12, 23, 31, 42, 48, 55, 64, 77] dizisinde ikili arama 12 ve 77 için hangi öğelere bakar?
- Üs alma algoritmasında taban = 2, üs = 10 için döngü kaç kez döner, sonuç nedir?
Cevapları göster
- (i, faktoriyel): (1, 1), (2, 2), (3, 6), (4, 24). Sonuç 24.
0 1 1 2 3 5 8. İlk iki terim döngüden önce yazılır; döngü i = 2 … 6 için 5 kez döner.- 25 / 2 = 12'ye kadar bölen dener ama 2, 3, 4'ten sonra 25 % 5 = 0 bulunur ve döngü kırılır: 4 deneme, "25 bir asal sayı değildir."
- 31: 5 karşılaştırma (son öğe, bulundu). 50: 5 karşılaştırma, bulunamadı (−1).
- 12: 42 → 12 (2 karşılaştırma, indis 1). 77: 42 → 55 → 64 → 77 (4 karşılaştırma, indis 8).
- 10 kez döner; sonuç 1024.
Özet
Örnek Problemler: Sıralama
- [29, 10, 14, 37, 13] dizisini seçimli sıralama ile sıralayın; her adımdan sonra diziyi yazın.
- [5, 1, 4, 2, 8] dizisine kabarcık sıralaması uygulayın. Birinci turdan sonra dizi nasıldır? Erken durma ile kaç tur çalışır?
- Seçimli sıralama 7 öğeli bir dizide kaç karşılaştırma yapar? Dizi zaten sıralı olsaydı sayı değişir miydi?
- Kabarcık sıralaması sıralı bir dizide (erken durma ile) kaç karşılaştırma yapar?
Cevapları göster
- [10, 29, 14, 37, 13] → [10, 13, 14, 37, 29] → [10, 13, 14, 37, 29] (14 zaten yerinde) → [10, 13, 14, 29, 37].
- 1. tur: [1, 4, 2, 5, 8]; 2. tur: [1, 2, 4, 5, 8]; 3. turda takas olmaz ve algoritma durur: 3 tur.
- 7 · 6 / 2 = 21 karşılaştırma. Değişmezdi: seçimli sıralama en küçüğü bulmak için kalan her öğeye bakmak zorundadır.
- n − 1 karşılaştırma (tek tur, hiç takas yok); 7 öğe için 6.
Özet
Alıştırmalar
- Üç tam sayının en büyüğünü bulan sözde kodu ve Java programını yazın; 6 farklı sıra ile test edin.
- 1'den n'e kadar sayıların toplamını döngüyle hesaplayın. n = 100 için sonucu n(n + 1)/2 formülüyle karşılaştırın.
- Bir sayının basamakları toplamını bulun (ipucu:
% 10ve/ 10). 1234 için sonuç? - Doğrusal aramayı, hedefin dizide kaç kez geçtiğini sayacak şekilde değiştirin.
- Kabarcık sıralamasını büyükten küçüğe sıralayacak şekilde değiştirin.
- Fibonacci algoritmasını Java'da
intile yazıp n = 50 için çalıştırın. Hangi terimden sonra sonuçlar bozulur? Neden?
Cevaplar / ipuçları
enBuyuk = birinci;ikinciveucuncusıraylaenBuyukile karşılaştırılıp gerekirse atanır. İç içe 6 kola gerek yok.toplam = 0ile başlayıptoplam = toplam + i; n = 100 için 5050 = 100 · 101 / 2.while (sayi > 0) { toplam += sayi % 10; sayi = sayi / 10; }→ 1 + 2 + 3 + 4 = 10.returnyerine birsayacartırılır ve döngü sonuna kadar devam eder; en sondasayacdöndürülür.- Yalnızca karşılaştırma yönü değişir:
dizi[j] < dizi[j + 1]ise yer değiştir. - F(46) = 1 836 311 903 son doğru terimdir; F(47)
intsınırını (2 147 483 647) aştığı için negatif çıkar (−1 323 752 223).longkullanılmalı.
Özet
Kaynaklar
- P. Deitel ve H. Deitel, Java: How to Program (Early Objects), 11. baskı, Pearson, 2017 (Bölüm 4: Algoritmalar ve sözde kod; Bölüm 19: Arama ve sıralama).
- A. B. Downey ve C. Mayfield, Think Java, 2. baskı, O'Reilly, 2019 (çevrim içi ücretsiz).
- R. Sedgewick ve K. Wayne, Algorithms, 4. baskı, Addison-Wesley, 2011 (Bölüm 1.1 ikili arama, 2.1 temel sıralamalar).
- T. H. Cormen, C. E. Leiserson, R. L. Rivest ve C. Stein, Introduction to Algorithms, 4. baskı, MIT Press, 2022.
- D. E. Knuth, The Art of Computer Programming, Vol. 3: Sorting and Searching, 2. baskı, Addison-Wesley, 1998.
- Oracle, The Java Tutorials: Language Basics, docs.oracle.com/javase/tutorial.