3 Eylül 2016 Cumartesi

Uzay Maceram

Uzay aracınızla üzerinize gelen meteorlardan kaçarak yada meteorları lazeriniz ile vurarak skor elde edebilirsiniz.
3 farklı uzay aracından istediğiniz uzay aracını seçip kullanabilrisiniz.
Oyunumuzu hem oyun içinde ki kontrollerden hem de sensör yardımı ile oynayabilirsiniz.
Ayar menüsünden menü sesi , oyun için sesleri , kontroller ve ya sensörü açıp kapatabilirsiniz.
İlk oyun denemem zaman buldukça geliştirmek için çalışacağım. Umarım beğenirsiniz.

Uygulamanın play store adresi için tıklayınız.

11 Ağustos 2016 Perşembe

Afşin Hesap Yönetici

İnternet sitelerindeki üyeliklerimizin her biri için ayrı kullanıcı adı ve şifre oluşturmaktayız. Kullanıdığımız web sitelerinin çoğunda üyelik sistemi olduğundan hesap bilgilerini akılda tutmak hem zor hemde gereksiz olmaktadır. Bunun önüne geçmek adına kısa pratik bir hesap bilgilerini tutan uygulama geliştirmiş bulunmaktayım. Umarım beğenir ve kullanırsınız. (İlk uygulamam :) )
Uygulamada veriler Aes şifreleme ile şifrelenerek saklanmaktadır.
Verilerinizin yedeğini oluşturabilir ve daha sonra tekrar kullanabilirsiniz.(Şifreleme anahtarı aynı ise)
Şifremi unuttum seçeneği bulunmaktadır.
Şifreleme anahtarı özel olmalı ve unutulmamalıdır.

Uygulamayı indirmek için tıklayın.

23 Haziran 2016 Perşembe

Fikstur Otomasyonu

Bu projemde ödev için yaptığım fikstur otomasyonunu sizlerle paylaşıyorum.
Projenin kodlarını csharp entity framework kullanarak yazıldı.Veritabanı olarak mssql kullanıldı.
Projenin yapılış amacıda tasarım desenlerini öğrenmekti.
Projede gözlemci(observer) ve singleton (tek nesne) tasarım desenleri kullanıldı.

Projeyi ve projenin kodlarını anlatmayacağım kodları indirip incelediğinizde anlayacağınızı sanıyorum.

Proje dosyalarına github adresinden ulaşabilirsiniz.

11 Mayıs 2016 Çarşamba

Metni İki Yana Yaslama

    Bu yazımda algoritma analizi dersimizde yaptığım metni iki yana yaslama programını sizlerle paylaşacağım. Metni iki yana yaslama problemini iki yöntemle ayrı ayrı yapmış bulunmaktayım. Bu yöntemler greedy(aç gözlü yaklaşım) ve dinamik programlamadır.

    Greedy yöntemi düz mantıkla çalışır şöyleki metindeki kelimeleri bir bir sırası ile işleme alır. Bu sıraya görede çıktı metnini oluşturur.

    Dinamik programlama yönteminde tüm kelimeler bir algoritma dahilinde işleme alınır ve kelimeler için en uygun yer belirlenir. Amaç her satırda en az boşluk olmasıdır.

     Dinamik programlama algoritmasının anlatımını youtube adresinde bulabilirsiniz.


Kodlara ulaşmak için github adresine gidin

4 Mayıs 2016 Çarşamba

Adisyon Otomasyonu

Bu yazımda proje ödevi olarak yaptığımız lokanta adisyon programını sizlerle paylaşıyorum.
Projenin kodlarını java swing kullanarak yazdık.Veritabanı olarak postgresql kullandık.
Projenin yapılış amacıda veritabanı ile proje yapmayı öğrenmekti.

Projeyi ve projenin kodlarını anlatmayacağım kodları indirip incelediğinizde anlayacağınızı sanıyorum. Projenin kullanılışı vs. Rapor.pdf dosyasında mevcuttur.

Proje dosyalarına github adresinden ulaşabilirsiniz.

24 Mart 2016 Perşembe

JavaDoc nedir?

JavaDoc nedir?
  Projelerimizde yazmış olduğumuz sınıfların başkaları tarafından kolay anlaşılmasını sağlamak için kullanılan bir yapıdır. Özellikle jar haline getirilmiş APIlerin kullanımında kullanıcıyı bilgilendirmek için çok önemlidir.

  JavaDoc bize dökümantasyon yazmak için bir format sunar.Bu formatta HTML etiketleri kullanılabileceği gibi JavaDoc'a ait etiketlerde mevcuttur.  JavaDoc dokümantasyonunu, class, interface ya da enum tiplerinden önce, nesne ve sınıf değişkenlerinden önce ve constructorlar dahil olmak üzere metotlardan önce, /**   */ formatında yazılır.  

  Dökümantasyonu yapılmış kodu HTML dökümantasyonu haline getirmek için jdk ile gelen javadoc aracı ile şu şekilde yapabilirsiniz.

javadoc -d documentation sınıf.java

Böylelikle sınıfımızın dokümantasyonunu "documentation" isimli bir dosyaya çıkarmış oluyoruz. Bir başka yolu kullandığınız IDE'lerin generate javadoc özelliğini kullanabilirsiniz.

JavaDoc'un etiketleri


@author     -> Geliştiren kişi
@param     -> Parametre tipi ve anlamı
@throws ,@exception    -> İstisna durumları ve anlamları
@return    -> Dönüş tipi
@see    -> Başka bir yere referans sağlar
@since    -> Hangi sürüm ile eklendiği
@version    -> Son güncellendiği sürüm
{@code}            -> Kodu belirtmek için
@deprecated    -> Artık kullanılmaması istemi
{@value}         -> Statik alanın doc açıklamada kullanıldığı zaman, o sabitin değerini gösterir.
{@link}          -> Başvurulan sınıfın belirtilen paket, sınıf veya üye adı belgelere işaret görünür .
{@linkplain}     -> Bağlantının etiketine hariç {@link}, Özdeş kod yazı daha düz metin olarak görüntülenir.
@serial             -> Varsayılan serializable alan için doc yorumda kullanılır.     
@serialData      -> writeObject () veya writeExternal tarafından yazılmış verileri belgelemektedir
@serialField     -> Bir ObjectStreamField bileşeni belgelemektedir.
{@inheritDoc}    -> En yakın kalıtsal sınıf veya uygulanabilir arayüz gösterir.
{@docRoot}     -> Üretilen her sayfa üretilen belgenin kök dizinine göre yolunu gösterir.   
{@literal}     -> literal metni belirtir. kapalı metin, HTML biçimlendirme veya iç içe javadoc etiketleri içermeyen olarak yorumlanır.

Küçük bir örnek ise şöyle verilebilir.


/**
* Merhaba, Dünya!
* Bu program javaya ilk başladığımızda yazacağımız programdır.
* Çıktı olarak konsol ekranına Merhaba,Dünya! yazar.
*
*
* @author  Eren Çetinkaya Cruz
* @version 1.0
* @since   2016-03-24 
*/
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
} 

Alışkanlık edinmek JavaDoc'u bundan sonraki yazılarımda kullanmaya çalışacağım.

Daha detaylı olarak JavaDoc resmi sitesinden öğrenebilirsiniz.
Başka bir kaç yer ingilizce olarak tutorialpoints veya türkçe olarak Akin Kaldiroglu hocamızın yazılarından faydalanabilirsiniz. 

5 Mart 2016 Cumartesi

Kurtul Oyunu (Html5)

  Bu yazımda pekiştirmek ve pratik yapmak için yazdığım ikinci oyunumu tanıtacağım.Bu oyunun yapımında da html5-JavaScript-JQuery kodlarını kullandım. Kısaca karakterimiz olan bir top nesnesi ile üzerimize gelen basamaklar dediğim çubuklardan kurtularak oyun alanının üzerine çıkmaya çalışıyoruz.

  Oyunumuzun görüntüsü şu şekildedir.

  Bu oyunları yazmamım en büyük nedenleri analitik düşünme ve algoritma kurma becerilerimi geliştirmektir. Topun duvarlar ile çarpışması veya basamaklar ile çarpışmaları olsun , basamakların uzunlukları ve çıktıkları konumları olsun bunların ayarlanması gerçekten ufkunuzu açıyor.

Örneğin basamakların ilk oluşturulduğu kod parçası şu şekildedir.

function basamaklariOlustur() {
    var indis;
    var x, en;
    var y = 0;
    for (indis = 0; indis <= basamakSayisi; indis++) {

        do {
            x = 10 + Math.random() * 300;
            en = 75 + Math.random() * 200;
        } while (x + en > alanG - 10);// konumu + eni sağdan fazla olmamasını sağlıyoruz

        //2 ve 3 katlarında köşelerden çıkmayı garanti ediyoruz
        if ((indis % 2) == 0 && !(x > 10 && x < karakterBoyutu - 2)) {
            do {
                x = 10 + Math.random() * 300;
            } while (!(10 < x && x < karakterBoyutu - 2));// 

        } else if ((indis % 3) == 0 && !(x + en > alanG - karakterBoyutu - 8 && x + en < alanG - 10)) {
            do {
                x = 10 + Math.random() * 300;
                en = 75 + Math.random() * 200;
            } while (!(x + en > alanG - karakterBoyutu - 8 && x + en < alanG - 10));// 

        }

        y -= 70;//her basamak arasına uzaklık koyuyoruz
        basamaklar[indis] = new BasamakNesnesi(x, y, en, basamakBoyu);
    }
}

Karakterimizin hareket kodları şu şekildedir.


function karakterHareket() {
    if (btnSol) {
        karakter.x += -karakterHareketpx;
    } else if (btnSag) {
        karakter.x += +karakterHareketpx;
    }
    // soldan çıkmaz
    if (karakter.x < 10 && btnSol) {
        karakter.x = 10;
    }// sağdan çıkmaz
    else if (karakter.x > alanG - 10 - karakterBoyutu && btnSag) {
        karakter.x = alanG - 10 - karakterBoyutu;
    }
    carpismaKontrol();

}

Kodlara ulaşmak için github adresine gidin.

3 Mart 2016 Perşembe

Masa Hokey Oyunu (Html5)

  Devamı gelirmi bilmiyorum ama bu yazımda Html5 Css3 JavaScript JQuery öğrendikten sonra pratik yapmak için yazdığım masa hokeyi oyununu tanıtacağım.
  Oyunum görüntüsü şu şekildedir.
  Bu oyunu geliştirirken html5'in canvas elemanını kullandım. JQuery metodlarını kullandım.Oyunun içindeki bileşenler top nesnesi hariç canvasın kendi grafik elamanlarıdır. Top nesnesi ise 50x50 png formatında resimdir.

Örneğin sol taraftaki kale nesnesinin kodları şu şekildedir.

  BobContext.beginPath();
  BobContext.fillStyle = 'red';  
  BobContext.rect(0, 100,5,200);   
  BobContext.fill();
  BobContext.lineWidth = 1;
  BobContext.stroke();
  BobContext.closePath();

Örneğin ortadaki yeşil yuvarlağın kodları şu şekildedir.

  BobContext.beginPath();
  BobContext.arc(BobContext.canvas.width/2, BobContext.canvas.height/2, BobContext.canvas.width/20, 0, 2 * Math.PI, false);
  BobContext.fillStyle = 'green';
  BobContext.fill();
  BobContext.lineWidth = 2;
  BobContext.stroke();
  BobContext.closePath();

Örneğin kalelerin kenarları ile çarpışma kodları şu şekildedir.

 //kale 1 üst çarpişma
 if(objBob.x == 0 && (objBob.y<100)){
 objBob.dx = -objBob.dx ;
 }//kale1 alt çarpişma
 if(objBob.x == 0 && (objBob.y > 300)){
 objBob.dx = -objBob.dx ;
 }//kale 2 üst çarpişma
 if(objBob.x == areaW-5 &&  (objBob.y<100)){
 objBob.dx = -objBob.dx ;
 }//kale 2 alt çarpişma
 if(objBob.x == areaW-5 && (objBob.y > 300 )){
 objBob.dx = -objBob.dx ;
 }
Kodlara ulaşmak için github adresine gidin.

26 Şubat 2016 Cuma

Eclipse Apache Tomcat 8 Görünmeme Sorunu

  Yazılımla uğraşırken bir hataya daha rastladım ve bu hatayıda ileride karşılaşırsam diye kayıt altına almaktayım. Gelelim hatamıza javaEE ile çalışırken eclipce'in javaEE sürümünün son versiyonunu indirmeme rağmen Apache Tomcat son versiyonlarının eclipse tarafından tanınmadığı bir hata aldım.
  İnternette biraz araştırma yaptıktan sonra aşağıdaki çözüme ulaştım.
Çözüm :
1- Eclipse açıyoruz sonra Help => Install New Software tıklıyoruz.
2- "Kepler- http://download.eclipse.org/releases/kepler" yada
    "Luna – http://download.eclipse.org/releases/luna" bunu kopayalıyoruz.
3- "Web, XML, and Java EE Development" kısmını açıyoruz.
4-  JST Server Adapters ve JST Server Adapters Extensions öğelerini indiriyoruz.
  - İndirme işlemi bitince Apache Tomcat'i tanıtmaya geçiyoruz
5- Window / Preferences / Server / Runtime Environments yolunu izliyoruz.
6- Add butonuna tıklıyoruz sonra yükleyeceğimiz versiyonu seçiyoruz.
7- Apache Tomcat'in yolunu belirtiyoruz Ok  butonuna basıp işlemlerimizi bitiriyoruz.

Böylece Apache Tomcat tanıtma işlemimizi yapıyoruz.

Metindeki Harflerin Sayısını Bulma

  Bu yazımızda bir metnin içinde geçen harflerin sayısını bulmaya çalışacağız.
Algoritma şöyle çalışmaktadır.
  İlk olarak metnin içindeki harf dışındaki karakterleri ayrıştırıyoruz. Bu metin içinde kaç farklı harf var ise onları buldurup farklı harf sayısı kadar dizi oluşturuyoruz.
  Sonra algoritmanın ana kısmına geçiyoruz yani metnin ayrıştırılmış tüm karakterlerini birbir bakarak kontrol ediyoruz. Metnin tüm karakterlerini kontrol ettiğimizden aynı karakteri tekrar yazmamak için dizimiz içinde o an kontrol edilen karakterin olup olmadığına bakıyoruz eğer yoksa yeni harf nesnesi oluşturup onu dizimize ekliyoruz.
  Bütün karakterler kontrol edildikten sonra dizimizi yazdırıyoruz.Yazdırırken metnin içindeki sıraya
göre yazdırılıyor.

Örnek bir metin ve sonucu şöyledir.
Bir cümle giriniz...
Bu bir deneme yazısıdır.
B -> 1
u -> 1
b -> 1
i -> 1
r -> 2
d -> 2
e -> 3
n -> 1
m -> 1
y -> 1
a -> 1
z -> 1
ı -> 3
s -> 1

Main metodu ve ana metodu koydum diğerlerini github adresinde bulabilirsiniz.


 public static void main(String[] args) {
        Harf harfDizisi[] = null;
        String cumlemiz = "";
        
        cumlemiz = cumleyiAl();

        harfDizisi = harfSay(cumlemiz);

        ciktiVer(harfDizisi);
    }

public static Harf[] harfSay(String cumle) {
        Harf harfDizisi[] = null;
        int farkliHarfSayisi = 0;
        int sayac = 0;

        farkliHarfSayisi = kacFarkliHarfVarKontrolEt(cumle);
        //harf dizimizi burada oluşturuyoruz
        harfDizisi = new Harf[farkliHarfSayisi];

        // cumlenin tum harflerini tektek konrol ediyoruz
        for (int i = 0; i < cumle.length(); i++) {
            char kontrolEdilecekHarf = cumle.charAt(i);

            int ayniHarfSayisi = ayniHarfSaysiniBul(cumle, kontrolEdilecekHarf);

            //aynı harften yok baska bir harf buyuzden dizimize ekliyoruz
            if (!aynisindanHarfDizisindeVarMi(harfDizisi, kontrolEdilecekHarf)) {
                //diziye yeni harf oluşturup ekliyoruz
                harfDizisi[sayac] = new Harf(kontrolEdilecekHarf, ayniHarfSayisi);
                sayac++;
            }
        }

        return harfDizisi;
    }


Kodlara ulaşmak için github adresine gidin

10 Şubat 2016 Çarşamba

Hızlı sıralama - Quick Sort

  Hızlı(Quick sort) sıralama algoritması çok hızlı algoritmalardan birisidir. Sadece eğitim amaçlı değil programların içerisinde de sıralama için kullanılmaktadır. Algoritma çok basittir ve yerinde sıralama yapar yani tek dizi üzerinde elemanların yerlerini değiştirerek işlem yapar. Böyle olması da zaman açısından ve alan açısından hız demektir.

Algoritmanın çalışma mantığı
  Sayı dizisinden herhangi bir sayıyı dayanak eleman(pivot) eleman olarak seç.
  Sayı dizisini dayanak elemandan(pivot) küçük olan tüm sayılar dayanak elemanın(pivot) önüne, dayanak elemandan(pivot) büyük olan tüm sayılar dayanak elemanın(pivot)  arkasına gelecek biçimde düzenle (dayanak elemana eşit olan sayılar her iki yana da geçebilir).
  Bu bölümlendirme işleminden sonra eleman sıralanmış son dizide olması gerektiği yere gelir. Algoritmanın bu aşamasına bölümlendirme aşaması denir.
  Dayanak elemanın sol ve sağ yanında olmak üzere oluşan iki ayrı küçük sayı dizisi, hızlı sıralama algoritması bu küçük parçalar üzerinde yeniden özyineli olarak çağrılarak sıralanır.

Algoritmanın karmaşıklığı
Hızlı sıralama algoritması n adet sayıyı, ortalama bir durumda, {O}(nlog(n)) karmaşıklığıyla, en kötü durumda ise {O}(n^2) karmaşıklığıyla sıralar.

Hızlı sıralama algoritması java kodları

 public static void hizliSiralama(int dizi[], int sol, int sag) {
  int indis = parca(dizi, sol, sag);
  if (sol < indis - 1) {
   hizliSiralama(dizi, sol, indis - 1);
  }
  if (indis < sag) {
   hizliSiralama(dizi, indis, sag);
  }
 }

 public static int parca(int dizi[], int sol, int sag) {
  int i = sol, j = sag;
  int gecici;
  int dayanakEleman = dizi[(sol + sag) / 2];

  while (i <= j) {
   
   //soldan başlayarak dayanak elemanı(pivot)tan küçük elemanı bul
   while (dizi[i] < dayanakEleman) {
    i++;
   }
   //sağdan başlayarak dayanak elemanı(pivot)tan büyük elemanı bul
   while (dizi[j] > dayanakEleman) {
    j--;
   }
   //bulunan elamanların yerlerini değiştir
   if (i <= j) {
    gecici = dizi[i];
    dizi[i] = dizi[j];
    dizi[j] = gecici;
    i++;
    j--;
   }
  };

  return i;
 }


Kodlara ulaşmak için github adresine gidin

9 Şubat 2016 Salı

Birleştirmeli Sıralama - Merge Sort

  Merge sort (bireşen sıralama), diziyi ardışık olarak en küçük alt dizilerine kadar yarılayan sonra da onları sıraya koyarak bireştiren özyineli bir algoritmadır. Yarılama işlemi en büyük alt dizi en çok iki öğeli olana kadar sürer. Sonra merge (bireşim) işlemiyle altdiziler ikişer ikişer bölünüş sırasıyla sıralı olarak bir üst dizide bireşir. Süreç sonunda en üstte sıralı diziye ulaşılır.

Algoritmanın çalışma mantığı şu şekildedir. 
  Sıralı olmayan listeyi ortadan eşit olarak iki alt listeye ayırır.
  Alt listeleri kendi içinde sıralar.
  Sıralı iki alt listeyi tek bir sıralı liste olacak şekilde birleştirir.

Algoritmanın karmaşıklığı 
  Birleştirme sıralaması böl ve yönet algoritmasına güzel bir örnektir. Birleştirme sıralamasının karmaşıklığını hesaplamak için sıralanacak N elemanlı diziyi bir ağaç yapısına taşıyınca her bir düğüm bir alt diziyi temsil eder.
  Ağaç tam olarak n seviye içerir. k sayısı 0'dan n-1'e kadar ağaç seviyesini temsil etsin, yukarıdan aşağıya doğru ağacın k. seviyesinde 2^k tane düğüm bulunur. Bu düğümlerin her biri 2^{n-k}uzunluğunda bir alt diziyi temsil eder.
  Bir alt dizinin eleman sayısı 2^{n-k} olduğu için en fazla 2^{n-k} karşılaştırma yapılabilir. Ağacın her seviyesindeki alt dizi sayısı ve yapılabilecek en fazla karşılaştırma sayısı2^k . 2^{n-k} = 2^n ' dır. n seviye ağaç için toplam n . 2^n karşılaştırma yapılır. Elde edilen n . 2^n değerinin asimptotik üst sınırı O(NlgN) değeridir.

 Birleştirmeli sıralama algoritması java kodları

 public static void birlestirmeliSiralama(int alt, int üst,int[] sirasizDizi) {
  if (alt < üst) {
   int orta = (alt + üst) / 2;
   //sirasiz dizimi yerel değişken yaptığımdan diziyide metodlara yolladım
   birlestirmeliSiralama(alt, orta, sirasizDizi); 
   birlestirmeliSiralama(orta + 1, üst,sirasizDizi);
   birlestir(alt, orta, üst,sirasizDizi);
  }
 }

 public static void birlestir(int alt, int orta, int üst,int[] sirasizDizi) {
  int[] yedekDizi = new int[sirasizDizi.length];
  int i, j, k;
// a dizisinin her iki yarısını yedekDizi dizinine kopyala
  for (i = alt; i <= üst; i++) {
   yedekDizi[i] = sirasizDizi[i];
  }
  i = alt;
  j = orta + 1;
  k = alt;
  // her adımda bir sonraki en büyük terimi kopyala
  while (i <= orta && j <= üst) {
   if (yedekDizi[i] <= yedekDizi[j]) {
    sirasizDizi[k++] = yedekDizi[i++];
   } else {
    sirasizDizi[k++] = yedekDizi[j++];
   }
  }
// varsa, ilk yarıdan arta kalan terimlerin hepsini kopyala
  while (i <= orta) {
   sirasizDizi[k++] = yedekDizi[i++];
  }
 }

Kodlara ulaşmak için github adresine gidin

25 Ocak 2016 Pazartesi

Eklemeli Sıralama - Insertion Sort

Eklemeli sıralama algoritması diziyi her adımda öğe öğe oluşturan bir sıralama algoritmasıdır.
Küçük Veri kümeleri üzerinde kullanıldığında verimlidir.Çoğunluğu zaten sıralanmış olan diziler üzerinde kullanıldığında verimlidir.
Sıralanacak diziyi yerinde sıralar, ek bir bellek alanı gerektirmez.

Algoritmanın çalışma mantığı şu şekildedir.
Geçici olarak atanan dizi elemanının yerini bulunup oraya koyulması üzerine çalışır.Yeri bulmak için
dizi içerisinde geçici elemanın bulunduğu yerden başa doğru kaydırma işlemi yapılmaktadır.

Algoritmanın karmaşıklığı
En kötü başarım: Eklemeli sıralama algoritması en kötü durumda, örneğin liste tersten sıralıysa O(n^2) karmaşıklıkla çalışır.
En iyi başarım: Eklemeli sıralama algoritması en iyi durumda, örneğin liste sıralıysa sadece  n-1 karşılaştırma yapar ve
 O(n) karmaşıklıkla çalışır.
Ortalama başarım: Eklemeli sıralama algoritması ortalama O(n^2) karmaşıklıkla çalışır.

Örnek
1.(5 1 4 2 8 ) \to ( 1 5 4 2 8 )
gecici = 1 olur j=0 olur 1-5 karşılaştırılıp 5 bir sağ kaydırılıp 1 j'ye koyulur
2.(1 5 4 2 8 ) \to ( 1 4 5 2 8 )
gecici = 4 olur j=1 olur 4-5 karşılaştırılıp 5 bir sağ kaydırılıp 4 j'ye koyulur
3.(1 4 5 2 8 ) \to ( 1 2 4 5 8 )
gecici = 2 olur 2-5 sonra 2-4 karşılaştırılıp 4 ve 5 bir sağ kaydırılır
her kaydırma için j bir azaltılır ve 2 j'ye koyulur
4.( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
sıralı olduğundan değişim yapılmaz

Eklemeli sıralama algoritması java kodları

public static void eklemeliSiralama(int[] dizi) {
  int gecici = 0, j = 0;
  
  for (int i = 1; i < dizi.length; i++) {
   gecici = dizi[i]; // i. eleman gecici yapıyoruz   
   j = i - 1; //i nin bir eksiğini j ye atıyoruz
   
   // j sıfırdan büyükse ve
   //  geçici, dizinin j. elamanından küçük olana kadar kaydırma yap
   while (j >= 0 && gecici < dizi[j]) {
    dizi[j + 1] = dizi[j];
    j = j - 1;
    dizi[j + 1] = gecici;
   }

  }
 }


Kodlara ulaşmak için github adresine gidin

23 Ocak 2016 Cumartesi

Seçmeli Sıralama - Selection Sort

Seçmeli sıralama algoritması, küçük boyutlu dizileri sıralarken veya dizinin bir bölümü sıralı ise yer değiştirme işlemi yapılmadığı için tercih edilir.

Algoritmanın çalışma mantığı şu şekildedir.

1.Listedeki en küçük değerli öğeyi bul.

2.İlk konumdaki öğeyle bulunan en küçük değerli öğenin yerini değiştir.
3.Yukarıdaki adımları listenin ilk elemanından sonrası için (ikinci elemandan başlayarak) yinele.

Algoritmanın karmaşıklığı
Seçmeli sıralama algoritması listenin en küçük elemanının nerede olduğunu bilmediği ve her bir eleman için tüm elemanlarla karşılaştırma yaptığı için liste içindeki elemanların rastgele sıralanmış ya da eşit elemanlardan oluşmasını dikkate almaz, bu sebeple seçmeli sıralama algoritması her durumda O(n^2) karmaşıklığıyla çalışır.

Örnek:
1. ( 5 1 4 2 8 ) \to ( 1 5 4 2 8 )
i=0 minIndis=0 (5 değeri) ile baslar j=1 (1 değeri) en küçük olduğundan minIndis=1 olur değiştiririz.
2.( 1 5 4 2 8 ) \to ( 1 2 4 5 8 )
i=1 minIndis=1 (5 değeri) ile baslar j=3 (2 değeri) en küçük olduğundan minIndis=3 olur değiştiririz.
3.( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
Döngümüz devam edecektir ama sıralama işlemi bu adımda bitti.

Seçmeli sıralama algoritması java kodları

 public static void secmeliSiralama(int[] dizi) {
  int yedek;
  int minIndis;
  
  for (int i = 0; i < dizi.length; i++) {
   minIndis = i;
   //Son indisten başlayarak karşılaştırmaya devam ediyoruz
   for (int j = i; j < dizi.length; j++) {
    //minIndis den daha küçük değer varsa indisi değiştiriyoruz
    if (dizi[j] < dizi[minIndis]) {
     minIndis = j;
    }
   }
   //burada değiştirme işlemini yapıyoruz
   yedek = dizi[i];
   dizi[i] = dizi[minIndis];
   dizi[minIndis] = yedek;
  }

 }

Kodlara ulaşmak için github adresine gidin

8 Ocak 2016 Cuma

Kabarcık Sıralama - Bubble Sort

     Bu yazımızda kabarcık sıralama (Bubble Sort) algoritmasını inceleyeceğiz.Öncelikle kabarcık sıralama algoritması hakkında bilgi verelim.Adına kabarcık sıralaması denmesinin nedeni büyük olan sayıların aynı suyun altındaki bir kabarcık gibi dizinin üstüne doğru ilerlemesidir.

Algoritmanın çalışma mantığı şu şekildedir.
     Kabarcık sıralaması dizinin başından başlar ve dizi elemanlarını sırayla seçer. Seçilen dizi elemanı kendinden sonra gelen elemandan büyükse bu iki elemanın yerleri değiştirilir. Bu işlem sonucunda dizinin en büyük elemanı dizi sonuna yerleştirildiğinden bir sonraki adımda arama sınırı bir eleman geri çekilir. Bu işlem, dizinin sonundaki elemanın karşılaştırılmasına kadar yinelenerek sürdürülür.

Algoritmanın karmaşıklığı
     Kabarcık sıralama algoritmasının ortalama ve en kötü durumdaki karmaşıklığı {O}(n^2)'dir. Algoritma ortalama ve en kötü durumda (n^2) / 2 adet karşılaştırma ve yer değiştirme gerçekleştirir.

Algoritmanın işleyişi
     İçeriği "5 1 4 2 8" olan bir dizi kabarcık sıralaması ile en küçükten en büyüğe doğru aşağıdaki biçimde sıralanır. Her adımda dizinin kalın olarak işaretlenmiş elemenları karşılaştırılan elemanlardır.

Birinci Geçiş:
( 5 1 4 2 8 ) \to ( 1 5 4 2 8 ) İlk iki elemanı karşılaştırır ve yerlerini değiştirir.
( 1 5 4 2 8 ) \to ( 1 4 5 2 8 )
( 1 4 5 2 8 ) \to ( 1 4 2 5 8 )
( 1 4 2 5 8 ) \to ( 1 4 2 5 8 ) Elemanlar zaten sıralı olduğu için algoritma yerlerini değiştirmez.
İkinci Geçiş:
( 1 4 2 5 8 ) \to ( 1 4 2 5 8 )
( 1 4 2 5 8 ) \to ( 1 2 4 5 8 )
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
Artık dizi sıralıdır ancak algoritma işlemin bittiğini bilmemektedir. 
Algoritmanın dizinin sıralandığını anlaması için bütün dizinin üzerinden hiçbir değişiklik yapmadan tam bir geçiş yapması gerekir.
Üçüncü Geçiş:
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
Sonuç olarak dizi sıralanmıştır ve algoritma sonlanır.

Kabarcık sıralama algoritması java kodları

public static void KabarcikSiralama(int[] dizi) {
  int temp;   // Yer değiştirmede kullanılacak geçici değişken
  
  for (int i = 1; i < dizi.length; i++) {
   for (int j = 0; j < dizi.length - i; j++) {
    
    //Önce gelen elaman bir sonrakinden büyükse ikisi yer değiştiriyor
    if (dizi[j] > dizi[j + 1]) {
     temp = dizi[j];
     dizi[j] = dizi[j + 1];
     dizi[j + 1] = temp;
    }
    
   }
  }
  
 }
  

Kodlara ulaşmak için github adresine gidin