30 Nisan 2015 Perşembe

Quick Sort

Quick Sort
Quick sort algoritması  ingilizce olarak çevirdiğimizde Hızlı sıralama algoritması olarak söyleyebilirz Böl yönet mantığında çalışmasına göre çalışmaktadır
Zaman  karmaşası en iyi durum O(nlog)  ortalama durumu genelde en kötü duruma daha yakındır yanındaki sayıyı ihmal edilir ve avarage case durumunu O(n^2) ve worst case ise O(n^2) dir
Çalışma mantığıda n/2 mantığına göre çalışan n/2 sol tarafı ve sağ tarafına göre  hizalama yapıyoruz ve pivot olarak belirlediğimiz bir sayı belirliyoruz ve ona göre işlemleri yapıyoruz ve unutmadan söyliyeyim pivot seçerkne durumları değişebilmektedir pivot seçimi bize en iyi durum en kötü duruma sonuçlandırmaktadır
Qoick sort işlem sonunda isteğe bağlı olarak küçükten büyüğe veya büyükten küçüğe sıralama yapmaktadır

Java kodları:
void quickSort(int arr[], int left, int right)
{
      int i = left, j = right;
      int tmp;
      int pivot = arr[(left + right) / 2];

      while (i <= j) {
            while (arr[i] < pivot)
                  i++;
            while (arr[j] > pivot)
                  j--;
            if (i <= j) {
                  tmp = arr[i];
                  arr[i] = arr[j];
                  arr[j] = tmp;
                  i++;
                  j--;
            }
      };

      if (left < j)
            quickSort(arr, left, j);
      if (i < right)
            quickSort(arr, i, right);
}


RADİX SORT

RADİX SORT
Bilgisayar biliminde çok önemli bir yere sahiptir Radix Sort algoritması çünkü bilgisayar bilimi ikilik tabanda işlem yapmaktadır yani (0 ve 1) ile
Bunun için küçükten büyüğe doğru ya da büyükten küçüğe doğru sıraladığımızda durun karmaşası olarak  O(n) sahiptir  aşağıdaki java kodunda görmekteyiz karmaşıklığı bir tane döngü var ayrı ayrı ve karmaşıklığı O(n) olmaktadır
Çalışma mantığı gayet basittir en anlamsız yani LSB bitine göre sıralama yapıyor önce LSB  0 bir yere sonra 1 bir yerde barındırıyor daha sonra ise ikinci ağırlıklı :LSB bitinde bunun tekrarını yapıyor bu işlem taki MSB bitine doğru gittiğinde işlem bitmiş oluyor böyle yaptığında zaten sıralama bitmiş oluyor böylelikle küçükten büyüğe doğru sıralama yapmaktayız
Önce bunu 10 tabanınıda göstermek istiyorum;
57, 43, 24, 213, 44, 102, 70, 37, 111, 23 sayılarını verelim  Radix Sort algoritması ile sıralayalım
·         İlk geçişte sayılar birler basamağına göre artan yönde sıralanır. Birler hanesinde aynı değeri alan 43, 213, 23 gibi sayılar, başlangıç dizisindeki veriliş sırasıyla yazılırlar.

70, 111, 102, 43, 213, 23, 24, 44, 57, 37
·         İkinci geçişte, ilk geçişte elde edilen dizi onlar basamağındaki değerlerine göre sıralanır.    

102, 111, 213, 23, 24, 37, 43, 44, 57, 70
·         Üçüncü geçişte, ikinci geçişte elde edilen dizi yüzler basamağındaki değerlerine göre sıralanır.

 23, 24, 37, 43, 44, 57, 70, 102, 111, 213 

Aynı mantığı diğer tabanlar içinde yapabiliriz işlem sırası ve işlemleri aynıdır. Şimdi ise Java kodlarını yazalım:




public static int[] sort(int[] old) {
   
for (int shift = Integer.SIZE - 1; shift > -1; shift--) {
       
int[] tmp = new int[old.length];
       
int j = 0;

       
for (int i = 0; i < old.length; i++) {
           
boolean move = old[i] << shift >= 0;

           
if (shift == 0 ? !move : move) {
                tmp
[j] = old[i];
                j
++;
           
} else {

                old
[i - j] = old[i];
           
}
       
}
       
for (int i = j; i < tmp.length; i++) {
            tmp
[i] = old[i - j];
       
}
        old
= tmp;
   
}

   
return old;
}



HEAP SORT ALGORİTMASI

HEAP SORT ALGORİTMASI
 Heap Sort Algoritması Türkce çevirisi olarak Yığun sırlaması olarak söyleyebilriiz ve bilgisayar teknolojisinde kullanılan karşılaştırmaya dayanan sıralı bir sıralamalı bir sıralamalı algoritmasıdır ve diğer sıralamalara göre yavaş çalışması ancak en kötü durumu yani Worst case O(nlogn) olması avantajıdır
Uzun zaman aldığından, büyük veri paketlerinde kullanılmamasına dikkat edilmelidir.Çalışma sistemine gelince: Arka kısımda 2li sıralama ağacı kullanır. Tüm sıralama işlemlerini bu ağaç üzerinde gerçekleştirir.
Algoritma, verilen veri kümesini 2’li ağaca çevirir. Bu işlemi yaparken herhangi bir koşul gözetilmez, elemanlar ağaca sırayla eklenir. Fakat ağaç oluşturduktan sonra ağacın en son elemanından başlayarak köke kadar tüm elemanları tarayarak, ağacın bir MAX ya da MIN HEAP ağacı olması sağlarız. (Bu kadarı, sıralamamızı azalan ya da artan olması durumuna göre karar veririz.). Bu işlemden sonra en sondaki eleman ile kök elemanının yerlerini değiştirilir ve en son yaprak ağaçtan koparılır.
Sıralama, yer değiştirme ve koparma işlemleri, ağaçta sadece kök elemanı kalana kadar tekrarlanır. Koparılan elemanlar konduğu sırada listeye geri alınır. Böylece sıralama yapılmış olur.











Sıralama örneği:
Bize verilen dizi: 4 1 3 2 16 9 10 14 8 7
2li ağacımızı oluşturalım:
Ağacı düzenleyelim (sıralama):
 
Ağacın son elemanı ile kökü yer değiştirelim, ve son düğümü ağaçtan kopartalım.
Ağacın en son hali:




Bilgisayar kodunu verelim;
public void heapsort(int[]A){
    int tmp;
    BuildHeap(A);
    for(int i = A.length-1; i>=0; i--)
    {
     tmp=A[0];
     A[0]=A[i];
     A[i]=tmp;
     heapsize = heapsize -1 ;
     heapify(A,0);
 
    }
  }


COUNTİNG SORT ALGORİTMASI

COUNTİNG SORT ALGORİTMASI
Counting sort Algoritması Türkce olarak sayarak sıralama olarak söylebiliriz
Sıralanmak istenen verimiz:
5,7,2,9,6,1,3,7 olsun
Bu dizi üzerinden bir kere geçilerek aşağıdaki sayma dizisi elde edilir:
Dizi indisi:
0
1
2
3
4
5
6
7
8
9
Değeri (sayma):
0
1
1
1
0
1
1
2
0
1
Yukarıdaki tabloda da gösterildiği üzere dizide bulunan en büyük eleman sayısı kadar eleman içeren bir sayma dizisi oluşturulmuş ve bu dizinin her elemanına, sıralanmak istenen dizideki her elemanın sayısı girilmiştir.
Bu sayma işleminden sonra sıralı dizinin üretilmesi yapılabilir. Bu işlem de dizinin üzerinden tek bir geçişle her eleman için kaç tekrar olduğu yazılarak yapılabilir. buna göre örneğin sıralanmış dizide 0 hiç olmayacak 1’den 1 tane, 2’den 1  tane olacak şeklinde devam eder ve sonuç:
1,2,3,5,6,7,7,9
şeklinde elde edilir.






JAVA KODUNU VERELİM
public static void countingsort(int[]A, int[]B, int k)
{
   int C[]=new int[k]; // sayma dizisi oluşturuluyor
   int i;      int j;
   for(i=0; i<k; i++)
   {   
C[i]=0;    
 }
   for(j=0; j<A.length; j++)
   {
      C[A[j]]=C[A[j]]+1 ;
   }
   for(i=1; i<k; i++)
   {
      C[i]=C[i]+C[i-1];
   }
   for(j=0; j<A.length; j++)
   {
      B[C[A[j]]]=A[j];         C[A[j]]=C[A[j]]-1;             }                            }
Yukarıdaki fonksiyon bir adet sıralanacak dizi, bir adet sıralanmış hali geri döndürecek  boş dizi ve dizideki en büyük sayının değerini alır. Sonuç ikinci parametre olan boş diziye döner.
Bu sıralama algoritmasının karmaşıklığı hesaplarnırsa. Dizideki her elemanın üzerinden bir kere geçilerek sayıları hesaplanır. Bu geçiş n elemanlı dizi için n zaman alır. Ayrıca dizideki en büyük elemanlı sayı kadar (bu örnekte k diyelim) büyük olan ikinci bir sayma dizisinin üzerinden de bir kere geçilir bu işlem de k zaman alır. Dolayısıyla toplam zaman n+k kadardır. Bu durumda zaman karmaşıklığı O(n) olur.
Hafıza karmaşıklığına baklırsa hafızada mevcut verilerin saklandığı bir dizi (yukarıdaki örnek kodda A dizisi). Sonuçların saklandığı ikinci bir dizi (yukarıdaki örnekte B dizisi) ve her elemanın kaçar tane olduğunun durduğu bir dizi (yukarıdaki örnekte C dizisi) tutulmaktadır. Bu durumda A ve B dizileri n, C dizisi ise k boyutundadır ve toplam hafıza ihtiyacı 2n+k kadardır.


NOTASYON NEDİR?

NOTASYON NEDİR?
Bilgisayar bilimnde şu  ifadeler çok önemlidir
 1-)Hız (V)
2)Bellek
Bu iki değerinde bellek birimi artık günümüzde çözüldü ancak hızlı olamk sorusuna cevap bulmak için notasyonları kullanıyoruz misalinde yazdığımız bir kodun daha önce yazılmış olan kodlar analizi yaparak testin sonunda belirleyebiliyoruz veya kendi yazdığımız kodun analizi yapıp notasyonu ile bu kodun tükettiği zamanı belirleyebilmekteyiz
Notasyonlarda BİG (0) avarage(teta) worst(omega) ile notasyonlar ile gösterebilmekteyiz bunlarda bizim için en önemlisi BİG(O) desek yanlış söylemiş olmayız çünkü bilgisayar her zaman çalışması en düşük duruma göre hızını belirler BİG(o) en üst sınır olarak  söyleyebiliriz
Büyük O gösterimi:
Gösterim                                   isim
O(1)                                            Sabit
O(logn)                                       Logaritmik
O[(logn)^c]                                 Poliogaritmik
O(n)                                             Liner   
O(nlog)                                        LogLineer
O(n^2)                                        Karesel
O(n^c)                                         Polinaml
O(c^n)                                        Üstel
O(n!)                                         Faktöriyel

O(n^n)                                     Geokombinator

Algoritma Nedir

Algoritma Nedir
Algoritma kelimesi Matematik ve Bilgisayar biliminde bir işi yaptırmak için tanımlanan b,r başlangıç durumundan başlandığında, ve açıkca belirlenmiş sonlu durumlar sayısına sahip olan kümedir.
Yani algoritmaya kısaca bir problemi çözmek için veya belirli bir amaca ulaşmaya çalışılan temel görevleri yerine getiren veya deyimlerin  adım adım belirlenerek işletilmesine denilmektedir
Ve bu adımların sıralanmasına çok dikkat edilmesi gerekir derleyici yada yorumlayıcı yukardan itirbaren aşağıa doğru gelirken teker teker okur ve bu işlemleri ona göre yapmaktadır ve algortma yaparken aynı derleyici veya yorumlayıcının  yaptığı tarama işlem gibi düşünmek ve ona göre adımları takip ederek sorumuza cevap bulmaya çalışırız ve bu durumda belirlenen durumların sonlu küme olması gerekir hiçbir bilgisayar sonsuz aralıkta işlem yapamaz yapmış olsaydı en küçük örneği gezgin satıcıdaki O(n^2) sorunu çözerdi  ya da DES algoritmasınının 80 bit standart hali 128 bit çözmesi ılları almakta bunun için başlangıç ve bitiş değeri çok öenmlidir
Bir problemi çözerken ya Algoritmik yada Sezgisel(Heuristik) olmak üzere iki yaklaşım mevcuttur bizim için hangisi daha iyi sonuç verecekse onunla çözmeliyiz

Aşağıdaki bait bir algoritma örenği ve adımları belirlenmiştir
 A0 --> Başla
 A1 --> Sayaç=0 (Sayaç'ın ilk sayısı 0 olarak başlar.)
 A2 --> Sayı=? : T=T+Sayı (Sayıyı giriniz. T'ye sayıyı ekle ve T'yi göster.)
 A3 --> Sayaç=Sayaç+1 (Sayaç'a 1 ekle ve sayacı göster.)
 A4 --> Sayaç<4 ise A2'ye git. (Eğer sayaç 4'ten küçükse Adım 2'ye git.)
 A5 --> O=T/4 (Ortalama için T değerini 4'e böl)
 A6 --> O'yu göster. (Ortalamayı göster.)
 A7 --> Dur