Bölüm 1.3: Algoritmalar

Java ile Nesne Yönelimli Programlama
Problem çözme adımlarıSözde kodKoda dönüştürme Örnek algoritmalarElle izlemeArama algoritmalarıSıralama algoritmaları
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Problem çözme

Bir problemi girdi, çıktı ve test senaryolarıyla tanımlamak; çözümü önce algoritma, sonra kod olarak yazmak.

Sözde kod ve izleme

Algoritmayı sözde kodla (pseudocode) ifade etmek ve değişken tablosuyla adım adım elle izlemek.

Java'ya dönüştürme

Okuma, yazma, karar ve döngü adımlarını Java karşılıklarına çevirmek.

Temel algoritmalar

Sıralı yazdırma, faktöriyel, Fibonacci, palindrom, asal sayı ve üs alma algoritmalarını yazmak ve test etmek.

Arama

Rastgele, doğrusal ve ikili aramayı karşılaştırmak; ikili aramanın neden sıralı veri gerektirdiğini açıklamak.

Sıralama

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

1Sorunutanımla2Algoritmabelirle3Kodadönüştür4Test et,doğrulahata bulunursa geri dön ve düzelt
  • 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.
Benzetme: Yemek tarifi bir algoritmadır. Malzemeler girdi, yapılış adımları algoritma, ortaya çıkan yemek çıktıdır. "Biraz tuz ekle" gibi belirsiz bir adım bilgisayar için yeterli değildir.
Girdi (input)

Sıfır veya daha fazla başlangıç verisi.

Çıktı (output)

En az bir sonuç üretir.

Kesinlik

Her adım açık ve tek anlamlıdır.

Sonluluk

Sonlu sayıda adımda biter.

Etkinlik

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.
girdi3, 5programçıktı8=beklenen: 8test geçti

Sorun: İki sayının toplamını hesaplamak

TestGirdiBeklenen çıktı
13, 58
2−2, 75
3 (sınır)0, 00

Sorun: Bir metindeki kelime sayısını bulmak

TestGirdiBeklenen çı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:

  1. İlk sayıyı al.
  2. İkinci sayıyı al.
  3. İki sayıyı topla.
  4. 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ımsayı1sayı2toplamEkran
1. İlk sayıyı al3
2. İkinci sayıyı al35
3. İki sayıyı topla358
4. Toplamı yazdır3588

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 kodAnlamıJava karşılığı
Başla … BitirAlgoritmanın başı ve sonumain metodunun { … } gövdesi
Oku xKullanıcıdan değer alx = tarayici.nextInt();
Yaz "…", xEkrana yazdırSystem.out.println("…" + x);
x = 5Değişkene değer atax = 5;
Eğer x = y iseEşitliği karşılaştırif (x == y) (iki eşittir!)
DeğilseKoşul yanlışsaelse
Döngü i = 1'den n'e kadarTekrarlafor (int i = 1; i <= n; i++)
Döngüyü KırDöngüden hemen çıkbreak;
%, ve, veyaKalan, 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.
Sözde kodalgoritmaToplama.javakaynak kodToplama.classbytecodeÇıktıJVM çalıştırırkodlamajavacjava
Algoritma adımıJava
İlk sayıyı alsayi1 = tarayici.nextDouble();
İkinci sayıyı alsayi2 = tarayici.nextDouble();
İki sayıyı toplatoplam = sayi1 + sayi2;
Toplamı yazdırSystem.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

double sayi1double sayi2double toplam

Klavyeden okumak için bir Scanner nesnesi oluşturulur; henüz hiçbir sayı yok.

double sayi1double sayi2double toplam

print mesajı yazar ama alt satıra geçmez; imleç mesajın hemen yanında bekler.

double sayi13.0double sayi2double toplam

Kullanıcı 3 yazıp Enter'a basar; nextDouble() bunu 3.0 olarak okur ve sayi1'e koyar.

double sayi13.0double sayi2double toplam

İkinci mesaj yazılır.

double sayi13.0double sayi25.0double toplam

Kullanıcı 5 girer; sayi2 = 5.0.

double sayi13.0double sayi25.0double toplam8.0

Sağ taraf önce hesaplanır: 3.0 + 5.0 = 8.0; sonuç toplam'a atanır.

double sayi13.0double sayi25.0double toplam8.0

+ metinleri birleştirir; sayılar metne çevrilerek tek satır oluşur.

double sayi13.0double sayi25.0double toplam8.0

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.

İki tam sayıyı sıralı yazdırma

Karar yapısı: Eğer … Değilse

Üç tam sayıyı sıralı yazdırma

İç içe kararlar, ve bağlacı

Faktöriyel bulma

Döngü ve biriktirici değişken

Fibonacci serisi

Döngüde değişkenleri kaydırma

Palindrom kontrolü

Metni temizleme, ters çevirme, karşılaştırma

Asal sayı kontrolü

Bayrak (flag) ve döngüyü kırma

Üs alma

Tekrarlı çarpma

Arama ve sıralama

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.

GirdiBeklenen
4, 114 11
13, 1111 13
7, 77 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)

birinciTamsayıikinciTamsayı

Kullanıcıdan birinci sayı istenir.

birinciTamsayı4ikinciTamsayı

Kullanıcı 4 girer; değer birinciTamsayı kutusuna yazılır.

birinciTamsayı4ikinciTamsayı11

İkinci sayı istenir; kullanıcı 11 girer.

birinciTamsayı4ikinciTamsayı11<doğru

Koşul: 4 < 11 → doğru.

birinciTamsayı4ikinciTamsayı11<doğru

Koşul doğru olduğu için ise kolu çalışır: önce birinci, sonra ikinci yazılır.

birinciTamsayı4ikinciTamsayı11

Algoritma biter. Çıktı 4 11, beklenenle aynı.

birinciTamsayıikinciTamsayı

İkinci test: algoritma 13 ve 11 girdileriyle yeniden çalıştırılıyor.

birinciTamsayı13ikinciTamsayı

Kullanıcı 13 girer; değer birinciTamsayı kutusuna yazılır.

birinciTamsayı13ikinciTamsayı11

İkinci sayı istenir; kullanıcı 11 girer.

birinciTamsayı13ikinciTamsayı11≮yanlış

Koşul: 13 < 11 → yanlış.

birinciTamsayı13ikinciTamsayı11≮yanlış

Koşul yanlış: Değilse koluna geçilir.

birinciTamsayı13ikinciTamsayı11≮yanlış

Önce ikinci (küçük olan), sonra birinci yazılır.

birinciTamsayı13ikinciTamsayı11

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)

birinci7ikinci3ucuncu57 ≤ 3 ? yanlış

Girdi 7, 3, 5. İlk koşul: 7 ≤ 3 yanlış; &&'nin sağ tarafına bakılmaz bile.

birinci7ikinci3ucuncu53 ≤ 7 ve 3 ≤ 5 : doğru

İkinci koşul: 3 ≤ 7 doğru ve 3 ≤ 5 doğru → en küçük ikinci.

birinci7ikinci3ucuncu5en küçük: 3

En küçük sayı yazılır; print satır sonu eklemez.

birinci7ikinci3ucuncu57 ≤ 5 ? yanlış

Kalan iki sayı karşılaştırılır: 7 ≤ 5 yanlış.

birinci7ikinci3ucuncu5sıra: 3 5 7

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.

nn!
01
11
36
5120
103 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)

12345××××faktoriyel = 1

Kullanıcı 5 girer.

12345××××faktoriyel = 1

Biriktirici 1 ile başlatılır.

12345××××faktoriyel = 1

Döngü: i = 1 (i ≤ 5 olduğu için gövde çalışır).

12345××××faktoriyel = 1

faktoriyel = 1 × 1 = 1.

12345××××faktoriyel = 1

Döngü: i = 2 (i ≤ 5 olduğu için gövde çalışır).

12345××××faktoriyel = 1 × 2 = 2

faktoriyel = 1 × 2 = 2.

12345××××faktoriyel = 1 × 2 = 2

Döngü: i = 3 (i ≤ 5 olduğu için gövde çalışır).

12345××××faktoriyel = 1 × 2 × 3 = 6

faktoriyel = 2 × 3 = 6.

12345××××faktoriyel = 1 × 2 × 3 = 6

Döngü: i = 4 (i ≤ 5 olduğu için gövde çalışır).

12345××××faktoriyel = 1 × 2 × 3 × 4 = 24

faktoriyel = 6 × 4 = 24.

12345××××faktoriyel = 1 × 2 × 3 × 4 = 24

Döngü: i = 5 (i ≤ 5 olduğu için gövde çalışır).

12345××××faktoriyel = 1 × 2 × 3 × 4 × 5 = 120

faktoriyel = 24 × 5 = 120.

12345××××faktoriyel = 1 × 2 × 3 × 4 × 5 = 120

i = 6 olur; 6 ≤ 5 yanlış olduğu için döngü biter.

12345××××faktoriyel = 1 × 2 × 3 × 4 × 5 = 120

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ı
10
20 1
50 1 1 2 3
70 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)

01234

Kullanıcı n = 5 girer: ilk 5 terim istenir.

0011234ab

İlk iki terim: a = 0, b = 1.

0011234ab

5 ≥ 1: a yazılır.

0011234ab

5 ≥ 2: b yazılır.

0011234ab

Döngü: i = 2 (i ≤ n − 1 = 4).

00111234ab

sonuc = a + b = 0 + 1 = 1.

00111234a,b

a = b → a = 1 (bir adım ileri kaydı).

00111234ab

b = sonuc → b = 1.

00111234ab

Yeni terim yazılır: 1.

00111234ab

Döngü: i = 3 (i ≤ n − 1 = 4).

001112234ab

sonuc = a + b = 1 + 1 = 2.

001112234a,b

a = b → a = 1 (bir adım ileri kaydı).

001112234ab

b = sonuc → b = 2.

001112234ab

Yeni terim yazılır: 2.

001112234ab

Döngü: i = 4 (i ≤ n − 1 = 4).

0011122334ab

sonuc = a + b = 1 + 2 = 3.

0011122334a,b

a = b → a = 2 (bir adım ileri kaydı).

0011122334ab

b = sonuc → b = 3.

0011122334ab

Yeni terim yazılır: 3.

0011122334ab

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.

GirdiBeklenen
abcbapalindrom
Kayakpalindrom
Kitapdeğil

Örnek Algoritmalar · Adım adım izle

Palindrom: Elle İzleme (abcba ve Kitap)

girdiMetinabcba

Kullanıcı abcba girer.

girdiMetinabcbatemizMetinabcba

Temizleme: küçük harfe çevrilir (değişiklik yok).

temizMetinabcbatersGirdiabcba

Temiz metin sondan başa okunur: abcba.

temizMetinabcbatersGirdiabcba

Karşılaştırma harf harf: bütün harfler eşleşti → doğru.

temizMetinabcbatersGirdiabcba

Koşul doğru: palindrom mesajı yazılır.

girdiMetinKitap

İkinci test: Kullanıcı Kitap girer.

girdiMetinKitaptemizMetinkitap

Temizleme: küçük harfe çevrilir ("Kitap" → "kitap").

temizMetinkitaptersGirdipatik

Temiz metin sondan başa okunur: patik.

temizMetinkitaptersGirdipatik

Karşılaştırma harf harf: kitap ≠ patik → yanlış.

temizMetinkitaptersGirdipatik

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ı / 2 tam 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)

bölen:23henüz bölen denenmedi

Kullanıcı 7 girer.

bölen:23henüz bölen denenmedi

7 ≥ 2 olduğu için bayrak True ile başlar.

bölen:237 % 2 = 1

Döngü: bölen = 2 (≤ 7 / 2 = 3).

bölen:237 % 2 = 1 → bölünmüyor

7 % 2 = 1 ≠ 0 → bölünmüyor, devam.

bölen:237 % 3 = 1

Döngü: bölen = 3 (≤ 7 / 2 = 3).

bölen:237 % 3 = 1 → bölünmüyor

7 % 3 = 1 ≠ 0 → bölünmüyor, devam.

bölen:237 % 3 = 1 → bölünmüyor

bölen = 4 olur; 4 ≤ 3 yanlış, döngü biter. Hiç bölen bulunmadı.

bölen:237 % 3 = 1 → bölünmüyor

Bayrak True: 7 asaldır.

bölen:2345678910henüz bölen denenmedi

İkinci test: Kullanıcı 21 girer.

bölen:2345678910henüz bölen denenmedi

21 ≥ 2 olduğu için bayrak True ile başlar.

bölen:234567891021 % 2 = 1

Döngü: bölen = 2 (≤ 21 / 2 = 10).

bölen:234567891021 % 2 = 1 → bölünmüyor

21 % 2 = 1 ≠ 0 → bölünmüyor, devam.

bölen:234567891021 % 3 = 0

Döngü: bölen = 3 (≤ 21 / 2 = 10).

bölen:234567891021 % 3 = 0 → tam bölünüyor

21 % 3 = 0 → tam bölünüyor!

bölen:234567891021 % 3 = 0 → tam bölünüyor

Bayrak indirilir: asalMi = False.

bölen:234567891021 % 3 = 0 → tam bölünüyor

Döngüyü Kır: kalan bölenler denenmez.

bölen:234567891021 % 3 = 0 → tam bölünüyor

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üsBeklenen
3481
2101024
501

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)

3333×××sonuc = 1

Kullanıcı taban = 3 girer.

3333×××sonuc = 1

Kullanıcı üs = 4 girer: 34 hesaplanacak.

3333×××sonuc = 1

Biriktirici 1 ile başlar.

3333×××sonuc = 1

Döngü: i = 1.

3333×××sonuc = 3

sonuc = 1 × 3 = 3.

3333×××sonuc = 3

Döngü: i = 2.

3333×××sonuc = 9

sonuc = 3 × 3 = 9.

3333×××sonuc = 9

Döngü: i = 3.

3333×××sonuc = 27

sonuc = 9 × 3 = 27.

3333×××sonuc = 27

Döngü: i = 4.

3333×××sonuc = 81

sonuc = 27 × 3 = 81.

3333×××sonuc = 81

i = 5 > 4: döngü biter.

3333×××sonuc = 81

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.
Problem tanımı

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

Rastgele (Random)

Her adımda rastgele bir öğe seçip hedefle karşılaştırır.

238421731548123rastgele sıra, tekrar olabilir

Sıra gerekmez · bulma garantisi yok

Doğrusal (Linear)

Öğeleri baştan sona sırayla tek tek karşılaştırır.

238421731548soldan sağa, tek tek

Sıra gerekmez · en fazla n karşılaştırma

İkili (Binary)

Ortadaki öğeye bakar, her adımda arama alanının yarısını eler.

5121823314248ortaelendisağ yarıda ara

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:
  1. Rastgele bir öğe seç.
  2. Seçilen öğeyi hedefle karşılaştır.
  3. Hedef bulunduysa işlemi sonlandır.
  4. 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

77042164212323455576487318aranan öğe: 48

Elimizde sırasız bir dizi var; aranan öğe 48.

77042164212323455576487318seçilen23 ile 48 karşılaştırılıyor

Adım 1: rastgele seçilen öğe 23; 23 ≠ 48, henüz bulunamadı. Yeni bir rastgele öğe seçilir.

77042164212323455576487318seçilen42 ile 48 karşılaştırılıyor

Adım 2: rastgele seçilen öğe 42; 42 ≠ 48, henüz bulunamadı. Yeni bir rastgele öğe seçilir.

77042164212323455576487318seçilen7 ile 48 karşılaştırılıyor

Adım 3: rastgele seçilen öğe 7; 7 ≠ 48, henüz bulunamadı. Yeni bir rastgele öğe seçilir.

77042164212323455576487318seçilen48 ile 48 karşılaştırılıyor

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:

  1. Öğeleri bir listeye (diziye) koy.
  2. İlk öğeden başlayarak sırayla hedef öğe ile karşılaştır.
  3. Hedef bulunursa işlemi sonlandır ve konumunu döndür.
  4. Bulunmazsa bir sonraki öğeye geç.
  5. 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

42017182233314idizi[0] = 42 ile 23 karşılaştırılıyor

Adım 1: aranan öğe 23. Dizinin ilk öğesinden (42) başlanır ve aranan öğe ile karşılaştırılır.

42017182233314idizi[1] = 17 ile 23 karşılaştırılıyor

Adım 2: ilk öğe (42) aranan öğe (23) ile eşleşmez. Bir sonraki öğeye geçilir: 17.

42017182233314idizi[2] = 8 ile 23 karşılaştırılıyor

Adım 3: ikinci öğe (17) de eşleşmez. Bir sonraki öğe: 8.

42017182233314idizi[3] = 23 ile 23 karşılaştırılıyor

Adım 4: üçüncü öğe (8) de eşleşmez. Bir sonraki öğe: 23.

42017182233314idizi[3] = 23: bulundu

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:

  1. Ortadaki öğeyi seç ve hedefle karşılaştır.
  2. Hedef bulunursa işlemi sonlandır.
  3. Hedef ortadakinden küçükse sol yarıya odaklan.
  4. Hedef ortadakinden büyükse sağ yarıya odaklan.
  5. 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

70121232313424485556647778altustaranan öğe: 48

Elimizde sıralı bir dizi var; aranan öğe 48. Arama alanı başta bütün dizi: alt = 0, üst = 8.

70121232313424485556647778altortaustorta = (0 + 8) / 2 = 4 → 42

Adım 1: dizinin ortasındaki öğe (42) alınır ve aranan öğe (48) ile karşılaştırılır.

70121232313424485556647778altust48 > 42 → sağ yarı

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

70121232313424485556647778altortaustorta = (5 + 8) / 2 = 6 → 55

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.

70121232313424485556647778alt,ust48 < 55 → sol yarı

Adım 4: 48, ortadaki öğeden (55) küçüktür; sağ taraf elenir. Geriye yalnızca [48] kalır.

70121232313424485556647778alt,orta,ustorta = 5 → 48 = 48

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

Doğrusal arama
  • Öğ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.
İkili arama
  • 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ı nDoğrusal (n)İkili (⌊log₂ n⌋ + 1)
994
1 0001 00010
1 000 0001 000 00020
1 000 000 0001 000 000 00030

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.
önce421782331sonra817233142sırala (artan)
Rastgele (Random)

Öğeleri rastgele karıştırır; sıralamayı garanti etmez.

Seçimli (Selection Sort)

En küçüğü seçip başa koyar.

Kabarcık (Bubble Sort)

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

42017182233314başlangıç dizisi

Elimizde sıralanmamış bir dizi var: [42, 17, 8, 23, 31].

310171422832341. karıştırma

Adım 1: dizi öğeleri rastgele bir sırayla düzenlenir: [31, 17, 42, 8, 23]. Her düzenleme farklı bir sonuç üretir.

802313124231742. karıştırma

Adım 2: dizi öğeleri tekrar rastgele bir sırayla düzenlenir: [8, 23, 31, 42, 17].

802311723134243. karıştırma

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:

  1. Koleksiyondaki en küçük öğeyi bul.
  2. Bu öğeyi koleksiyonun başına taşı (ilk öğeyle yer değiştir).
  3. Geri kalan kısımdaki en küçük öğeyi bul.
  4. Onu ikinci pozisyona taşı.
  5. 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

640251122223114365486başlangıç

Elimizde sıralanmamış bir dizi var: [64, 25, 12, 22, 11, 36, 48].

640251122223114365486ienKucuksıralanmamış kısmın en küçüğü: 11

Adım 1: sıralanmamış kısmın (indis 0–6) en küçüğü 11. 1. pozisyondaki 64 ile yer değiştirecek.

1102511222236443654861. adımdan sonra

Dizi 1. adımdan sonra: [11, 25, 12, 22, 64, 36, 48]. Yeşil kısım artık sıralı ve yerinde.

110251122223644365486ienKucuksıralanmamış kısmın en küçüğü: 12

Adım 2: sıralanmamış kısmın (indis 1–6) en küçüğü 12. 2. pozisyondaki 25 ile yer değiştirecek.

1101212522236443654862. adımdan sonra

Dizi 2. adımdan sonra: [11, 12, 25, 22, 64, 36, 48]. Yeşil kısım artık sıralı ve yerinde.

110121252223644365486ienKucuksıralanmamış kısmın en küçüğü: 22

Adım 3: sıralanmamış kısmın (indis 2–6) en küçüğü 22. 3. pozisyondaki 25 ile yer değiştirecek.

1101212222536443654863. adımdan sonra

Dizi 3. adımdan sonra: [11, 12, 22, 25, 64, 36, 48]. Yeşil kısım artık sıralı ve yerinde.

110121222253644365486i, enKucuksıralanmamış kısmın en küçüğü: 25

Adım 4: sıralanmamış kısmın (indis 3–6) en küçüğü 25. Zaten yerinde: değişiklik yok.

1101212222536443654864. adımdan sonra

Dizi 4. adımdan sonra: [11, 12, 22, 25, 64, 36, 48]. Yeşil kısım artık sıralı ve yerinde.

110121222253644365486ienKucuksıralanmamış kısmın en küçüğü: 36

Adım 5: sıralanmamış kısmın (indis 4–6) en küçüğü 36. 5. pozisyondaki 64 ile yer değiştirecek.

1101212222533646454865. adımdan sonra

Dizi 5. adımdan sonra: [11, 12, 22, 25, 36, 64, 48]. Yeşil kısım artık sıralı ve yerinde.

110121222253364645486ienKucuksıralanmamış kısmın en küçüğü: 48

Adım 6: sıralanmamış kısmın (indis 5–6) en küçüğü 48. 6. pozisyondaki 64 ile yer değiştirecek.

1101212222533644856466. adımdan sonra

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:

  1. Koleksiyonun başından başla.
  2. İki yan yana öğeyi karşılaştır; gerekiyorsa yer değiştirip büyük olanı sağa taşı.
  3. Koleksiyonun sonuna kadar bu adımı tekrarla (bir tur).
  4. En büyük öğe sona geldiği için son öğeyi sıralanmış kabul et.
  5. İ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

640251122223114365486başlangıç

Elimizde sıralanmamış bir dizi var: [64, 25, 12, 22, 11, 36, 48].

250641122223114365486jj+11. tur · yer değiştirdi

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

250121642223114365486jj+11. tur · yer değiştirdi

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

250121222643114365486jj+11. tur · yer değiştirdi

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

250121222113644365486jj+11. tur · yer değiştirdi

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

250121222113364645486jj+11. tur · yer değiştirdi

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

250121222113364485646jj+11. tur · yer değiştirdi

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

120251222113364485646jj+12. tur · yer değiştirdi

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

120221252113364485646jj+12. tur · yer değiştirdi

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

120221112253364485646jj+12. tur · yer değiştirdi

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

120221112253364485646jj+12. tur · değişiklik yok

Adım 10 (2. tur): 25 ve 36 karşılaştırılır; 25 < 36, değişiklik yok.

120221112253364485646jj+12. tur · değişiklik yok

Adım 11 (2. tur): 36 ve 48 karşılaştırılır; 36 < 48, değişiklik yok.

120221112253364485646jj+13. tur · değişiklik yok

Adım 12 (3. tur): 12 ve 22 karşılaştırılır; 12 < 22, değişiklik yok.

120111222253364485646jj+13. tur · yer değiştirdi

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

120111222253364485646jj+13. tur · değişiklik yok

Adım 14 (3. tur): 22 ve 25 karşılaştırılır; 22 < 25, değişiklik yok.

120111222253364485646jj+13. tur · değişiklik yok

Adım 15 (3. tur): 25 ve 36 karşılaştırılır; 25 < 36, değişiklik yok.

110121222253364485646jj+14. tur · yer değiştirdi

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

110121222253364485646jj+14. tur · değişiklik yok

Adım 17 (4. tur): 12 ve 22 karşılaştırılır; 12 < 22, değişiklik yok.

110121222253364485646jj+14. tur · değişiklik yok

Adım 18 (4. tur): 22 ve 25 karşılaştırılır; 22 < 25, değişiklik yok.

110121222253364485646jj+15. tur · değişiklik yok

Adım 19 (5. tur): 11 ve 12 karşılaştırılır; 11 < 12, değişiklik yok.

110121222253364485646jj+15. tur · değişiklik yok

Adım 20 (5. tur): 12 ve 22 karşılaştırılır; 12 < 22, değişiklik yok.

110121222253364485646dizi sıralı

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çimliKabarcık
FikirRastgele diziliş üretEn küçüğü seç, başa koyKomşuları karşılaştır, büyüğü sona taşı
Sonuç sıralı mı?Garanti yokEvetEvet
Karşılaştırma (n öğe)—her zaman n(n − 1)/2en kötü n(n − 1)/2, sıralı dizide n − 1
Yer değiştirmen − 1en fazla n − 1en kötü n(n − 1)/2
Örnek dizi (n = 7)—21 karşılaştırma, 5 gerçek takas20 karşılaştırma, 11 takas
Seçimli sıralamanın ve kabarcık sıralamasının işi n² ile büyür: 1 000 öğe için yaklaşık 500 000, 1 000 000 öğe için yaklaşık 500 milyar karşılaştırma. Bu yüzden büyük veride daha akıllı algoritmalar (ör. birleştirmeli sıralama, n · log₂ n) kullanılır.

Sıralama Algoritmaları

Beş Sıralama Algoritmasının Karşılaştırması

AlgoritmaFikirOrtalamaEn kötüNot
Kabarcık (Bubble Sort)komşu iki öğe karşılaştırılır, gerekirse yer değiştirirO(n²)O(n²)basit; büyük verilerde etkisiz
Seçimli (Selection Sort)en küçük bulunur, başa yerleşir; kalanla tekrarlanırO(n²)O(n²)büyük verilerde yavaş
Eklemeli (Insertion Sort)sıradaki öğe sıralı kısımda uygun yere eklenirO(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ştirO(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ı
n · log n ile büyüyen algoritmalar 1 000 000 öğe için yaklaşık 20 milyon karşılaştırma yapar; n² ile büyüyenler için bu sayı yaklaşık 500 milyardır.

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

AlgoritmaTemel fikirKullanılan yapıÖrnek
İki / üç sayı sıralamaKarşılaştır, küçüğü önce yazEğer … Değilse, iç içe karar13, 11 → 11 13
Faktöriyel1'den n'e kadar çarpDöngü + biriktirici (1 ile başlar)5! = 120
FibonacciHer terim önceki ikisinin toplamıDöngü + değişken kaydırma0 1 1 2 3
PalindromTemizle, ters çevir, karşılaştırMetin işlemleri, kararkayak → evet
Asal sayı2 … n/2 arasında bölen araBayrak + Döngüyü Kır21 → değil
Üs almaTabanı üs kez çarpDöngü + biriktirici3⁴ = 81
Rastgele / doğrusal / ikili aramaRastgele dene / sırayla bak / yarıyı eleDöngü, karar; ikilide sıralı dizi9 öğede en çok 4 karşılaştırma (ikili)
Karıştırma / seçimli / kabarcıkRastgele diz / en küçüğü seç / komşuları değiştirİç içe döngü, takasn(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

Biriktiriciyi yanlış başlatmakfaktoriyel = 0 ile başlanırsa her çarpım 0 olur. Toplama için 0, çarpma için 1 ile başlanır.
Döngü sınırında bir fazla/eksikFibonacci'de i = 2 … n − 1 yerine 2 … n yazılırsa n + 1 terim çıkar (off-by-one). Sınırlar küçük bir testle elle izlenir.
İkili aramayı sırasız dizide kullanmak[77, 42, 64, 12, 23, 55, 7, 48, 31] içinde 77 aranınca -1 döner: hata mesajı yok, sonuç yanlış.
Sınır durumları unutmakAsal kontrolünde 0 ve 1, faktöriyelde 0!, Fibonacci'de n = 1 ayrıca test edilmeli.
Rastgele aramada durma koşulu yokHedef koleksiyonda yoksa döngü sonsuza kadar sürer; bir deneme sınırı gerekir.
Takası geçici değişkensiz yapmaka = b; b = a; iki değişkeni de b yapar. Önce gecici = a saklanmalı.

Özet

Sık Yapılan Hatalar: Java

HataNe olur?
import java.util.Scanner; unutulduDerleme hatası: error: cannot find symbol … symbol: class Scanner
Satır sonunda ; yok: int toplam = 0Derleme 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ırmakDerlenir 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 kullanmakHata mesajı yok, sonuç yanlış: 1932053504 (doğrusu 6227020800). long kullanılmalı.

Özet

Örnek Problemler

  1. Faktöriyel algoritmasını sayı = 4 için izleyin: her turda i ve faktoriyel değerleri nedir?
  2. Fibonacci algoritması n = 7 için ne yazdırır? Döngü kaç kez döner?
  3. Asal sayı algoritması 25 için kaç bölen dener ve ne yazdırır?
  4. [42, 17, 8, 23, 31] dizisinde doğrusal arama 31 ve 50 için kaç karşılaştırma yapar?
  5. [7, 12, 23, 31, 42, 48, 55, 64, 77] dizisinde ikili arama 12 ve 77 için hangi öğelere bakar?
  6. Üs alma algoritmasında taban = 2, üs = 10 için döngü kaç kez döner, sonuç nedir?
Cevapları göster
  1. (i, faktoriyel): (1, 1), (2, 2), (3, 6), (4, 24). Sonuç 24.
  2. 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.
  3. 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."
  4. 31: 5 karşılaştırma (son öğe, bulundu). 50: 5 karşılaştırma, bulunamadı (−1).
  5. 12: 42 → 12 (2 karşılaştırma, indis 1). 77: 42 → 55 → 64 → 77 (4 karşılaştırma, indis 8).
  6. 10 kez döner; sonuç 1024.

Özet

Örnek Problemler: Sıralama

  1. [29, 10, 14, 37, 13] dizisini seçimli sıralama ile sıralayın; her adımdan sonra diziyi yazın.
  2. [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?
  3. Seçimli sıralama 7 öğeli bir dizide kaç karşılaştırma yapar? Dizi zaten sıralı olsaydı sayı değişir miydi?
  4. Kabarcık sıralaması sıralı bir dizide (erken durma ile) kaç karşılaştırma yapar?
Cevapları göster
  1. [10, 29, 14, 37, 13] → [10, 13, 14, 37, 29] → [10, 13, 14, 37, 29] (14 zaten yerinde) → [10, 13, 14, 29, 37].
  2. 1. tur: [1, 4, 2, 5, 8]; 2. tur: [1, 2, 4, 5, 8]; 3. turda takas olmaz ve algoritma durur: 3 tur.
  3. 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.
  4. n − 1 karşılaştırma (tek tur, hiç takas yok); 7 öğe için 6.

Özet

Alıştırmalar

  1. Üç 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.
  2. 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.
  3. Bir sayının basamakları toplamını bulun (ipucu: % 10 ve / 10). 1234 için sonuç?
  4. Doğrusal aramayı, hedefin dizide kaç kez geçtiğini sayacak şekilde değiştirin.
  5. Kabarcık sıralamasını büyükten küçüğe sıralayacak şekilde değiştirin.
  6. Fibonacci algoritmasını Java'da int ile yazıp n = 50 için çalıştırın. Hangi terimden sonra sonuçlar bozulur? Neden?
Cevaplar / ipuçları
  1. enBuyuk = birinci; ikinci ve ucuncu sırayla enBuyuk ile karşılaştırılıp gerekirse atanır. İç içe 6 kola gerek yok.
  2. toplam = 0 ile başlayıp toplam = toplam + i; n = 100 için 5050 = 100 · 101 / 2.
  3. while (sayi > 0) { toplam += sayi % 10; sayi = sayi / 10; } → 1 + 2 + 3 + 4 = 10.
  4. return yerine bir sayac artırılır ve döngü sonuna kadar devam eder; en sonda sayac döndürülür.
  5. Yalnızca karşılaştırma yönü değişir: dizi[j] < dizi[j + 1] ise yer değiştir.
  6. F(46) = 1 836 311 903 son doğru terimdir; F(47) int sınırını (2 147 483 647) aştığı için negatif çıkar (−1 323 752 223). long kullanı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.

Son

Bölüm 1.3: Algoritmalar
Sonraki bölüm: Bölüm 1.4: Akış Diyagramları · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.