BMP Resim Dosya Yapısı

BM – Windows 3.1x, 95, NT, … Yapısı anlatılmıştır.

BMP dosyası 3 kısımdan oluşur:

1. Dosya Header (Başlık) Kısmı

2. Header (Başlık) Bilgisi Kısmı

3. Veri (Data) Kısmı

SnapCrab_No-0081

Dosya Başlığı (Header)

Toplam 14 Byte’tan oluşur.

İlk 2 Byte dosya imzasını temsil eder.

Sonraki 4 Byte dosyanın boyutunu verir.

Sonraki 2 Byte Uygulamalara özgü ayrılmıştır.

Sonraki 2 Byte Uygulamalara özgü ayrılmıştır.

Sonraki 4 Byte Veri (Data) başlangıç adresini verir.

 

Adres (Offset) Uzunluk Açıklama
0 2 Byte – ASCII Dosya İmzası
BM – Windows 3.1x, 95, NT, …
BA – OS/2 struct Bitmap Array
CI – OS/2 struct Color Icon
CP – OS/2 const Color Pointer
IC – OS/2 struct Icon
PT – OS/2 Pointer
2 4 Byte – uint Dosya Boyutu
6 2 Byte Uygulamalara özgü ayrılmıştır.
8 2 Byte Uygulamalara özgü ayrılmıştır.
10 4 Byte – uint Veri (Data) başlangıç adresi

 

Header (Başlık) Bilgisi

BMP-BM dosyası başlık bilgisi boyutu 40 Byte’tır.

4 Byte Başlık Bilgisi uzunluğunu verir.

4 Byte Resim genişliğini verir. Piksel cinsinden.

4 Byte Resim yüksekliğini verir. Piksel cinsinden.

2 Byte Color Planes (Renk düzlemini verir) Değeri 1’dir.

2 Byte Renk derinliğini verir. 24, 32

4 Byte Sıkıştırma metodunu verir.

4 Byte Resim Boyutunu verir. Raw Bitmap veri boyutudur.

4 Byte Resmin yatay çözünürlüğü.

4 Byte Resmin dikey çözünürlüğü.

4 Byte Renk Sayısı.

4 Byte Kullanılan önemli renklerin sayısı. Genellikle göz ardı edilir.

 

Adres (Offset) Uzunluk Açıklama
14 4 Byte – uint Başlık (Header) Bilgisi Uzunluğu
18 4 Byte – int Resim Genişliği
22 4 Byte – int Resim Yüksekliği
26 2 Byte – ushort Color Planes (Renk düzlemini verir) Değeri 1
28 2 Byte – ushort Renk Derinliği
1-Bit
4-Bit
8-Bit
16-Bit
24-Bit
32-Bit
30 4 Byte – uint Sıkıştırma Metodu
0 – Sıkıştırma Yok
1 – 8-Bit RLE (Run Length Encoding) Sıkışrması
2 – 4-Bit RLE (Run Length Encoding) Sıkışrması
34 4 Byte – uint Raw Bitmap veri boyutu
38 4 Byte – int Yatay Çözünürlük
42 4 Byte – int Dikey Çözünürlük
46 4 Byte – uint Renk Sayısı
50 4 Byte – uint Kullanılan önemli renklerin sayısı.

 

Veri (Data)

1-Bit için 2 renk vardır. Bunlar Siyah ve Beyazdır.

2-Bit için 4 renk vardır. 1 Byte’ta 4 piksel saklanır.

4-Bit için 16 renk vardır. 1 Byte’ta 2 piksel saklanır.

8-bit için 255 renk vardır. 1 Byte’ta 1 piksel saklanır.

16-bit için 65536 renk vardır. 2 Byte’ta 1 piksel saklanır.

24-bit için 16,777,216 renk vardır. 3 Byte’ta 1 piksel saklanır.

32-Bit için 4,294,967,296 renk vardır. 4 Byte’ta 1 piksel saklanır.

 

Renk paleti için RGB kullanılır. Kırmızı, Yeşil ve Mavi ana renk karışımlarından oluşur.

 

8-Bit için;

İlk 3 bit Kırmızı renk değerini, sonraki 3 bit yeşil renk değerini, kalan 2 bit ise mavi renk değerini tutar.

KKKYYYMM

 

24-Bit için;

1. Byte Mavi değerini tutar.

2. Byte Yeşil değerini tutar.

3. Byte Kırmızı değerini tutar.

 

32-Bit için;

1. Byte Mavi değerini tutar.

2. Byte Yeşil değerini tutar.

3. Byte Kırmızı değerini tutar.

4. Byte Alpha değerini tutar.

 

İlk veri pikseli en sondan (Y-1) ve soldan (0) başlar. Sağa doğru genişlik kadar (G-1), sonra bir yukarı (Y-2), sonra genişlik kadar (G-1) sağa devam eder.

SnapCrab_No-0082

 

Kaynak
http://en.wikipedia.org/wiki/BMP_file_format

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

ID3 Etiketi

MPEG katman (layer) I, II, III ses dosyalarında yer alır ve başlık, artist vb. bilgileri tutar.

ID3v1

Dosyanın sonunda bulunur. Ses verisinden sonra gelir.

Toplam 128 byte yer tutar.

İlk 3 byte verisi ASCII karakter olarak TAG ile başlar.

Sonraki 30 byte’lık veri başlık bilgisini tutar.

Sonraki 30 byte’lık veri artist bilgisini tutar.

Sonraki 30 byte’lık veri albüm bilgisini tutar.

Sonraki 4 byte’lık veri yıl bilgisini tutar.

Sonraki 30 byte’lık veri yorum-açıklama bilgisini tutar.

Sonraki 1 byte’lık veri tür-tarz ID bilgisini tutar.

Toplamda 30+30+30+4+30+1 = 125 byte ve 3 byte’lık TAG verisiyle beraber 128 byte eder.

 

Alan Uzunluk
TAG 3 Karakter
Başlık 30 Karakter
Artist 30 Karakter
Albüm 30 Karakter
Yıl 4 Karakter
Yorum-Açıklama 30 Karakter
Tür-Tarz ID 1 Byte – 0-255
1 Byte = 1 Karakter, 1 Byte = 0-255

Tür-Tarz Tablosu

ID Hex Tür-Tarz ID Hex Tür-Tarz ID Hex Tür-Tarz ID Hex Tür-Tarz
0 00 Blues 20 14 Alternative 40 28 Alternative Rock 60 3C Top 40
1 01 Classic Rock 21 15 Ska 41 29 Bass 61 3D Christian Rap
2 02 Country 22 16 Death Metal 42 2A Soul 62 3E Pop/Funk
3 03 Dance 23 17 Pranks 43 2B Punk 63 3F Jungle
4 04 Disco 24 18 Soundtrack 44 2C Space 64 40 Native American
5 05 Funk 25 19 Euro-Techno 45 2D Meditative 65 41 Cabaret
6 06 Grunge 26 1A Ambient 46 2E Instrumental Pop 66 42 New Wave
7 07 Hip-Hop 27 1B Trip-Hop 47 2F Instrumental Rock 67 43 Psychedelic
8 08 Jazz 28 1C Vocal 48 30 Ethnic 68 44 Rave
9 09 Metal 29 1D Jazz & Funk 49 31 Gothic 69 45 Showtunes
10 0A New Age 30 1E Fusion 50 32 Darkwave 70 46 Trailer
11 0B Oldies 31 1F Trance 51 33 Techno-Industrial 71 47 Lo-Fi
12 0C Other 32 20 Classical 52 34 Electronic 72 48 Tribal
13 0D Pop 33 21 Instrumental 53 35 Pop-Folk 73 49 Acid Punk
14 0E Rhythm and Blues 34 22 Acid 54 36 Eurodance 74 4A Acid Jazz
15 0F Rap 35 23 House 55 37 Dream 75 4B Polka
16 10 Reggae 36 24 Game 56 38 Southern Rock 76 4C Retro
17 11 Rock 37 25 Sound Clip 57 39 Comedy 77 4D Musical
18 12 Techno 38 26 Gospel 58 3A Cult 78 4E Rock & Roll
19 13 Industrial 39 27 Noise 59 3B Gangsta 79 4F Hard Rock

 

ID3v1.1

ID3v1 deki yorum-açıklama kısmı 28 byte veriye indirilip kalan 2 byte’lık veriye albüm track alanı eklenmiştir.

 

Alan Uzunluk
TAG 3 Karakter
Başlık 30 Karakter
Artist 30 Karakter
Albüm 30 Karakter
Yıl 4 Karakter
Yorum-Açıklama 28 Karakter
Albüm Track 2 Byte (İlk Byte her zaman 0 ikinci Byte 1-255 Albüm Track)
Tür-Tarz ID 1 Byte – 0-255
1 Byte = 1 Karakter, 1 Byte = 0-255

 

Genişletilmiş ID3v1

ID3v1 etiketinden önce yerleştirilir.

227 Byte yer tutar.

İlk 4 Byte verisi ASCII karakter olarak TAG+ ile başlar.

Sonraki 60 Byte’lık veri başlık bilgisini tutar.

Sonraki 60 Byte’lık veri artist bilgisini tutar.

Sonraki 60 Byte’lık veri albüm bilgisini tutar.

Sonraki 1 Byte’lık veri hız bilgisini tutar.

Sonraki 30 Byte’lık veri tür-tarz bilgisini tutar.

Sonraki 6 Byte’lık veri başlangıç zamanını tutar. (mmm:ss)

Sonraki 6 Byte’lık veri bitiş zamanını tutar. (mmm:ss)

 

Alan Uzunluk
TAG+ 4 Karakter
Başlık 60 Karakter
Artist 60 Karakter
Albüm 60 Karakter
Hız 1 Byte (0 – Tanımsız, 1 – Yavaş, 2 – Orta, 3 – Hızlı, 4 – Çok Hızlı)
Tür-Tarz 30 Karakter
Başlangıç-Zaman 6 Karakter (mmm:ss)
Bitiş-Zaman 6 Karakter (mmm:ss)
1 Byte = 1 Karakter, 1 Byte = 0-255, m = dakika, s = saniye

 

 ID3v2

Dosyanın ilk başında yer alır. İlk 10 Byte ID3 bilgisidir.

ASCII karakter ID3 ile başlar.

Sonraki 2 byte’ın birinci byte versiyonu verir. İkinci byte 0’dır.

Sonraki 1 byte bayrağı temsil eder.

Sonraki 4 byte verinin boyutunu verir.* (4 x 0xxxxxxx – 7. bit alınmaz.)

 

Etiket Uzunluk Açıklama
ID3 3 Karakter ASCII Karakter
Versiyon 2 Byte Birinci Byte versiyon, İkinci Byte 0
Bayrak 1 Byte Versiyon 2 – ab000000
Versiyon 3 – abc00000
Versiyon 4 – abcd0000
Boyut 4 Byte 4 * 0xxxxxxx (Bit) 7. Bit Yok sayılır.
1 Byte = 1 Karakter, 1 Byte = 0-255

ID3v2 boyutu : 10 + (4 byte verinin boyutu)

Sonra Frame etiketleri gelir.

 

Versiyon 2’de Frame Etiketi: İlk 3 byte Frame Etiketi, Sonraki 3 byte uzunluk. Toplam 6 Byte + uzunluktan oluşur.

Versiyon 3 ve 4′ te ise İlk 4 Byte Frame Etiketi, Sonraki 4 Byte uzunluk, Sonraki 2 Byte bayraktan oluşur. Toplam 10 Byte + uzunluktan oluşur.

 

Versiyon 2 Versiyon 3 Versiyon 4 Açıklama
BUF RBUF RBUF Önerilen Tampon Boyutu
Tampon Boyutu      xx xx xx xx (4 Byte)
Embedded info flag 0000000x (Bit)
Offset to next tag    xx xx xx xx (4 Byte)
CNT PCNT PCNT Play counter
xx xx xx … (Frame Boyutu kadar)
COM COMM COMM Yorum-Açıklama
Metin Kodlaması  xx (1 Byte)
Dil                     xx xx xx (3 Byte)
Kısa Açıklama     <metin> (0 Byte’a kadar)
Açıklama            <metin>
CRA AENC AENC Ses Şifrelemesi
Sahip Kimliği           <metin> (0 Byte’a kadar)
Önizleme Başlangıcı xx xx (2 Byte)
Önizleme Uzunluğu  xx xx (2 Byte)
Şifreleme Bilgisi      <İkili (Binary) Veri>
CRM Encrypted Meta Frame
Sahip Kimliği      <metin> (0 Byte’a kadar)
İçerik/Açıklama  <metin> (0 Byte’a kadar)
Şifreli Veri Bloğu <İkili (Binary) Veri>
ETC ETCO ETCO Olay Zamanlama Kodları
EQU EQUA EQU2 Equalization
GEO GEOB GEOB Genel Kapsüllü Nesne
Metin Kodlaması   xx (1 Byte)
MIME tipi             <metin> (0 Byte’a kadar)
Dosya Adı           <metin> (0 Byte’a kadar)
İçerik Açıklaması <metin> (0 Byte’a kadar)
Kapsüllü Nesne    <İkili (Binary) Veri>
IPL IPLS Involved People List
Metin Kodlaması xx (1 Byte)
İçerik                <metin>
LNK LINK LINK Bağlantı Bilgileri
Frame Kimliği     xx xx xx (3 Byte)
URL                   <metin> (0 Byte’a kadar)
Ek Kimlik Verisi   <metin>
MCI MCDI MCDI Müzik CD Kimliği
CD TOC     <İkili (Binary) Veri>
MLL MLLT MLLT MPEG Konum Arama Tablosu
MPEG frames between reference xx xx (2 Byte)
Bytes between reference            xx xx xx (3 Byte)
Milliseconds between reference   xx xx xx (3 Byte)
Bits for bytes deviation               xx (1 Byte)
Bits for milliseconds dev.            xx (1 Byte)
PIC APIC APIC Ekli Resim
Metin Kodlaması xx (1 Byte)
Resim Format     xx xx xx (3 Byte – V2) – MIME Tipi metin (0 Byte’a kadar – V3-V4)
Resim Tipi          xx (1 Byte)
Açıklama            <metin> (0 Byte’a kadar)
Resim Veri          <İkili (Binary) Veri>
POP POPM POPM Popülerlik Sayacı
Kullanıcı E-postası <metin> (0 Byte’a kadar)
Reyting                xx (1 Byte)
Sayaç                  xx xx xx … (Frame uzunluğuna kadar)
REV RVRB RVRB Reverb
Reverb left (ms)                     xx xx (2 Byte)
Reverb right (ms)                   xx xx (2 Byte)
Reverb bounces, left               xx (1 Byte)
Reverb bounces, right             xx (1 Byte)
Reverb feedback, left to left     xx (1 Byte)
Reverb feedback, left to right   xx (1 Byte)
Reverb feedback, right to right xx (1 Byte)
Reverb feedback, right to left   xx (1 Byte)
Premix left to right                  xx (1 Byte)
Premix right to left                  xx (1 Byte)
TAL TALB TALB Albüm/Film/Show Başlık
Metin Kodlaması xx (1 Byte)
İçerik                <metin>
TBP TBPM TBPM BPM (Beats Per Minute)
TAL – TALB Bakınız.
TCM TCOM TCOM Composer
TAL – TALB Bakınız.
TCO TCON TCON İçerik Tipi
TAL – TALB Bakınız.
TCR TCOP TCOP Telif Hakkı Mesajı
TAL – TALB Bakınız.
TDA TDAT Tarih
TAL – TALB Bakınız.
TT1 TIT1 TIT1 İçerik Grup Açıklaması
TAL – TALB Bakınız.
TT2 TIT2 TIT2 Başlık/Şarkı Adı/İçerik Açıklaması
TAL – TALB Bakınız.
TT3 TIT3 TIT3 Altyazı
TAL – TALB Bakınız.
TXT TEXT TEXT Söz Yazarı/Metin Yazarı
TAL – TALB Bakınız.

 

Devamı en kısa zamanda yazılacak Allah’ın izniyle.

 

Kaynaklar

http://id3.org/ID3v1

http://id3.org/id3v2-00

http://id3.org/d3v2.3.0

http://id3.org/id3v2.4.0-frames

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

 

Quick Sort (Hızlı Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Hızlı sıralama algoritması adından da anlaşıldığı üzere hızlı sıralama algoritmalarından birisidir. Çalışma mantığı; herhangi bir sayı seçilir. Buna Pivot denir. Ortadaki, sondaki, baştaki veya rastgele bir sayı da olabilir. Küçük olan sayılar; seçilen sayının soluna, büyük olan sayılar sağına yazılır. Küçük olan ve büyük olan sayılarda aynı şekilde sıralanır. Bir örnekle açıklayalım.

Şöyle bir dizimiz olsun.

SnapCrab_No-0073

Sondaki elemanı pivot olarak seçelim ve küçük olanları sola, büyük olanları sağa yazalım.

SnapCrab_No-0075

Sonra sağ ve sol kısımda aynı şekilde sıralanır. Tek eleman kalana kadar bu işlem devam eder. İşlemin sonunda dizi sıralanmış olur.

SnapCrab_No-0076

 

C#

void main(){
    int[] d = Quick_Sort(new int[]{76, 6, 4, 19, 50}, 0, 5);

    //Konsola yaz
    for (int i = 0; i < d.Length; i++){
        Console.Write(d[i] + " ");
    }
    Console.ReadKey();
}

//@parametreler dizi, index(0), diziuzunluk
int[] Quick_Sort(int[] dizi, int sol, int sag) {
    //Pivot olarak son elemanı seç
    int p = dizi[sag - 1], i = sol, j = sag - 2, temp = 0;

    if (sag - sol > 2){
        while (i < j){
            //Sol kısımdaki eleman pivot elemandan büyükse seç
            while (dizi[i] < p) { i++; }

            //Sağ kısımdaki eleman pivot elemandan küçükse seç
            while (j > 0 && dizi[j] > p) { j--; }

            if (i < j){
                temp = dizi[i];
                dizi[i++] = dizi[j];
                dizi[j--] = temp;
            }
        }
    }

    //Pivot elemanı karşılaştır ve yer değiştir
    if (p < dizi[i]){
        temp = dizi[i];
        dizi[i] = dizi[sag - 1]; 
        dizi[sag - 1] = temp;
    }

    //Solda eleman varsa
    if(i - sol > 1)
        dizi = Quick_Sort(dizi, sol, i);

    //Sağda eleman varsa
    if(sag - (i+1) > 1)
        dizi = Quick_Sort(dizi, i + 1, sag);

    return dizi;
}

Proje dosyasını buradan indirebilirsiniz.

 

PHP

$b = QuickSort(array(3, 2, 9, 12, 42, 50, 15), 0, 7);

//Ekrana yaz
for ($i=0; $i < count($b); $i++) { 
	echo $b[$i] . ' ';
}

//@parametreler dizi, index(0), diziuzunluk
function QuickSort($dizi, $sol, $sag){
	//Pivot olarak son elemanı seç
    $p = $dizi[$sag - 1]; 
    $i = $sol; 
    $j = $sag - 2;

    if ($sag - $sol > 2){
        while ($i < $j){
            //Sol kısımdaki eleman pivot elemandan büyükse seç
            while ($dizi[$i] < $p) { $i++; }

            //Sağ kısımdaki eleman pivot elemandan küçükse seç
            while ($j > 0 && $dizi[$j] > $p) { $j--; }

            if ($i < $j){
                $temp = $dizi[$i];
                $dizi[$i++] = $dizi[$j];
                $dizi[$j--] = $temp;
            }
        }
    }

    //Pivot elemanı karşılaştır ve yer değiştir
    if ($p < $dizi[$i]){
        $temp = $dizi[$i];
        $dizi[$i] = $dizi[$sag - 1]; 
        $dizi[$sag - 1] = $temp;
    }

    //Solda eleman varsa
    if($i - $sol > 1)
        $dizi = QuickSort($dizi, $sol, $i);

    //Sağda eleman varsa
    if($sag - ($i+1) > 1)
        $dizi = QuickSort($dizi, $i + 1, $sag);

    return $dizi;
}

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

 

Comb Sort (Tarak Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Tarak sıralama algoritması kabarcık sıralama (Bubble Sort) algoritmasının geliştirilmiş halidir. Kabarcık sıralama algoritmasında ardışık olarak karşılaştırılır. Tarak sıralamasında ise aralarında 1’den fazla boşluk olabilir.

Şöyle bir dizimiz olsun. Küçükten büyüğe doğru sıralayalım.

SnapCrab_No-0062

 

İlk önce dizinin boyutu 1,3’e bölünür. Bölünen kısmın tam kısmı alınır.  5/1,3 = 3,8. Tam kısmı 3.

İlk eleman seçilir ve üç fazlası olan eleman karşılaştırılır.

SnapCrab_No-0063

Sonra ikinci eleman seçilir ve +3 fazlası olan eleman karşılaştırılır.

SnapCrab_No-0064

Sonra üçüncü eleman seçilir. +3 fazlası dizinin uzunluğunu aştığı için işlem yapılamaz. Boşluk sayısı tekrar 1,3’e bölünür ve tam kısmı alınır. 3 / 1,3 = 2,3 Tam kısmı 2 olarak alınır. Birinci eleman seçilir ve +2 fazla elemanla karşılaştırılır.

SnapCrab_No-0065

İkinci eleman seçilir ve +2 fazlası olan elemanla karşılaştırılır. Sonra diğer elemanlar seçilip +2 fazlası elemanlar dizinin sonuna kadar karşılaştırılır.

SnapCrab_No-0067SnapCrab_No-0068

Dizinin sonuna geldiğinde tekrar boşluk sayısı 1,3’e bölünür. 2 / 1,3 = 1,5 tam kısmı alınır 1. Birinci eleman seçilir ve 1 fazlası yani sonraki elemanla karşılaştırılır. Sonra ikinci eleman sonraki elemanla. Diğer elemanlarda bir sonraki elemanlarla karşılaştırılır.

SnapCrab_No-0069SnapCrab_No-0070SnapCrab_No-0071SnapCrab_No-0072

 

Sonunda dizimiz sıralanmış olur.

C#

void Main()
{
    int[] d = CombSort(new int[] {4, 10, 1, 6, 7 });
    for (int i = 0; i < d.Length; i++){
        Console.Write(d[i] + " ");
    }
    Console.ReadKey();
}

int[] CombSort(int[] dizi) {
    int bosluk = dizi.Length;
    bool degisti = false;
    while (bosluk > 1 || degisti) {
        if(bosluk > 1)
            bosluk =(int) ((float) bosluk / 1.3f);

        degisti = false;

        for (int i = 0; i + bosluk < dizi.Length; i++){
            if (dizi[i + bosluk] < dizi[i]) {
                int temp = dizi[i + bosluk];
                dizi[i + bosluk] = dizi[i];
                dizi[i] = temp;
                degisti = true;
            }
        }
    }
    
    return dizi;
}

Proje dosyasını buradan indirebilirsiniz.

 

PHP

$d = CombSort(array(4, 10, 1, 6, 7));
for ($i = 0; $i < count($d); $i++){
    echo $d[$i] . ' ';
}

function CombSort($dizi) {
    $bosluk = count($dizi);
    $degisti = false;
    while ($bosluk > 1 || $degisti) {
        if($bosluk > 1)
            $bosluk = intval($bosluk / 1.3);

        $degisti = false;

        for ($i = 0; $i + $bosluk < count($dizi); $i++){
            if ($dizi[$i + $bosluk] < $dizi[$i]) {
                $temp = $dizi[$i + $bosluk];
                $dizi[$i + $bosluk] = $dizi[$i];
                $dizi[$i] = $temp;
                $degisti = true;
            }
        }
    }
    
    return $dizi;
}

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

Gnome Sort (Cüce Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Cüce sıralama algoritmasının çalışma mantığı; İlk elemanı seçer sonrakiyle karşılaştırır (küçük veya büyüğe) sıralamaya göre yer değiştirir. Sonra ondan önceki eleman varsa bir öncekiyle karşılaştırır. Yer değiştirmezse tekrar kaldığı elemandan aynı şekilde devam eder.

Elimizde şöyle bir dizimiz olsun. Küçükten büyüğe doğru sıralayalım.

SnapCrab_No-0054

İlk önce birinci eleman seçilir. Sonraki elemanla karşılaştırılır.

3-5’den küçük olduğu için yer değiştirir. Birinci elemandan önce eleman olmadığı için ikinci eleman seçilir.

SnapCrab_No-0055

1-5’den küçük olduğu için yer değiştirir. Önceki elemanlar olduğu için son eleman işaretlenir. Önceki elemanlar karşılaştırılır.

SnapCrab_No-0056

1-3’den küçük olduğu için yer değiştirir. Bakılacak eleman kalmadığı için işaretlenen eleman ve sonraki eleman karşılaştırılır.

SnapCrab_No-0057

10-5’den küçük olmadığı için yer değiştirilmez. Diğer eleman seçilir ve karşılaştırılır.

SnapCrab_No-0059

7-10’dan küçük olduğu için yer değiştirir. ve son karşılaştırılan eleman işaretlenir. 7 olan elaman önceki elemanla karşılaştırılır.

7-5’den küçük olmadığı için işaretlenen eleman sonda olduğunda sıralama işlemi tamamlanır.

SnapCrab_No-0060

Özet olarak bir eleman sonraki elemanla karşılaştırılır. Yer değiştirilirse; önceki elemanlar yer değiştirilene kadar bakılır. Yer değiştirme olmadığı zaman dizide kalınan son elemandan devam edilir.

C#

void Main()
{
    int[] d = Gnome_Sort(new int[] {5, 3, 1, 10, 7});

    for (int i = 0; i < d.Length; i++){
        Console.Write(d[i] + " ");
    }

    Console.ReadKey();
}

int[] Gnome_Sort(int[] dizi){
    int i = 0, j = 1;
    while (i < dizi.Length - 1 ) {
        if (i == -1)
            i = j;

        if (dizi[i + 1] > dizi[i])
            i = j++;
        else {
            int temp = dizi[i];
            dizi[i] = dizi[i + 1];
            dizi[i + 1] = temp;
            i--;
        }
    }

    return dizi;
}

Proje dosyasını buradan indirebilirsiniz.

 

PHP

$d = Gnome_Sort(array(5, 3, 1, 10, 7));

for ($i = 0; $i < count($d); $i++){
    echo $d[$i] . ' ';
}

function Gnome_Sort($dizi){
    $i = 0; $j = 1;
    
    while ($i < count($dizi) - 1 ) {
        if ($i == -1)
            $i = $j;

        if ($dizi[$i + 1] > $dizi[$i])
            $i = $j++;
        else {
            $temp = $dizi[$i];
            $dizi[$i] = $dizi[$i + 1];
            $dizi[$i + 1] = $temp;
            $i--;
        }
    }

    return $dizi;
}

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

Pigeonhole Sort (Güvercin Yuvası Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Güvercin yuvası algoritması minimum ve maksimum sayılar arasındaki veriler için bir dizi oluşturup bu dizide sayıları sayıp, buna göre sıralama işlemi yapar. Pek kullanılmaz. Bunun sebebi sıralamanın hızlı şekilde nadiren oluşmasıdır.

Örnekle açıklayacak olursak eğer, şöyle bir dizimiz olsun.

SnapCrab_No-0049

Bu dizimizde 9 ve 19 arasında sayılar var. Arasındaki sayılar kadar güvercin yuvası oluşturuyoruz.

SnapCrab_No-0050

Sıfırıncı index dizideki minimum değeri, sonuncu index ise maksimum değeri temsil eder.

Şimdi A dizimizdeki sayılardan kaç tane varsa B dizimizde (+1 arttıralım) saydıralım.

SnapCrab_No-0051

 

Şimdi ise B dizisine baştan itibaren bakılır. hangi eleman 0’dan büyük ise o eleman sırasıyla diziye eklenir. Değeri -1 azaltılır. 0 olana kadar diziye eklenir. Sonra diğer elemanlara bakılır. Sonunda dizimiz sıralanmış olur.

 

SnapCrab_No-0053

void Main()
{
    int[] d = Pigeonhole_Sort(new int[] { 12, 16, 19, 10, 9});

    //Diziyi konsola yaz
    for (int i = 0; i < d.Length; i++){
        Console.Write(d[i] + " ");
    }

    Console.ReadKey();
}

int[] Pigeonhole_Sort(int[] Dizi)
{
    //Min ve max değerleri bul
    int min = Dizi[0], max = Dizi[0];
    foreach (int x in Dizi){
        min = Math.Min(x, min);
        max = Math.Max(x, max);
    }

    //Yuvaları tanımla
    int[] yuvalar = new int[max - min + 1];

    //Sayıları say
    foreach (int x in Dizi)
        yuvalar[x - min]++;

    //Diziyi Sırala
    int k = 0;
    for (int i = 0; i < yuvalar.Length; i++)
        while (yuvalar[i]-- > 0)
            Dizi[k++] = i + min;

    return Dizi;
}

Proje dosyasını buradan indirebilirsiniz.

 

PHP

$d = Pigeonhole_Sort(array(12, 16, 19, 10, 9));

//Diziyi ekrana yaz
for ($i = 0; $i < count($d); $i++){
    echo $d[$i] . ' ';
}

function Pigeonhole_Sort($Dizi)
{
    //Min ve max değerleri bul
    $min = $Dizi[0]; $max = $Dizi[0];
    foreach ($Dizi as $x){
        $min = min($x, $min);
        $max = max($x, $max);
    }

    //Yuvaları tanımla ve sıfırla
    $yuvalar = array();
    for ($i=0; $i < count(max - min + 1); $i++) { 
    	$yuvalar[$i] = 0;
    }

    //Sayıları say
    foreach ($Dizi as $x)
        $yuvalar[$x - $min]++;

    //Diziyi Sırala
    $k = 0;
    for ($i = 0; $i < count($yuvalar); $i++)
        while ($yuvalar[$i]-- > 0)
            $Dizi[$k++] = $i + $min;

    return $Dizi;
}

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

Radix Sort (Taban veya Basamağa Göre Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Radix sıralama algoritması ilk önce birler basamağındaki rakamı veya harfi karşılaştırıp bir sıralama yapar. Sonra o sıralamanın onlar basamağına göre tekrar dizilimini yapar. En fazla hangi basamaklı sayı varsa o basamağa kadar bu şekilde sıralama devam eder. Son basamak sıralamasında dizi sıralanmış olur.

Şöyle bir dizimiz olsun. Küçükten büyüğe doğru sıralayalım.

SnapCrab_No-0044

 

İlk önce birler basamağına göre sıralama yapılır.

SnapCrab_No-0045

 

Sonra onlar basamağına göre sıralama yapılır.

SnapCrab_No-0046

 

Sonra yüzler basamağına göre sıralama yapılır.

SnapCrab_No-0047

 

Son olarak en büyük sayı binler basamağında olduğu için binler basamağına göre sıralama yapılır.

SnapCrab_No-0048

 

Ve sonunda dizi sıralanmış olur.

Aslında her basamakta rakamlar arsındaki uzaklığa bakılır ve sıralama yapılır. Yani aslında basamaklar arasındaki rakamlara göre sayarak sıralama yapılır. Couting Sort (buradan bakabilirsiniz) sıralamasını kullanarak yazabiliriz. Sayı yerine rakamları sayacağımız için 0-9 uzunluğunda bir diziye ihtiyacımız var. Sayıları sayıp uzaklığına göre dizimize yerleştiririz. Tabiki bu son basamağa kadar tekrar edecektir. Dilerseniz while döngüsüyle veya recursive bir fonksiyonla yazabilirsiniz.

void Main()
{
int[] d = Radix_Sort(new int[]{1000, 32, 353, 21, 421});

//Konsola yaz
for (int i = 0; i < d.Length; i++){
    Console.Write(d[i] + " ");
}

Console.ReadKey();

}

int[] Radix_Sort(int[] dizi, int b = 1) {
    int[] a = new int[10];
    int[] c = new int[dizi.Length];

    int i = 0, ra = 0, p =  b * 10, k = 0;

    //Rakamlara göre say
    for (i = 0; i < dizi.Length; i++){
        ra = (dizi[i] % p) / b;

        //Kaçıncı basamağındaysa en büyük sayıyı al
        if(dizi[i] / p > k)
            k = dizi[i] / p;
        a[ra]++;
    }

    //n = n + (n - 1)
    for (i = 1; i < a.Length; i++){
        a[i] += a[i - 1];
    }

    //a daki indexlere göre sayıları sırala
    for (i = dizi.Length -1; i >= 0; i--){
        ra = (dizi[i] % p) / b;
        c[--a[ra]] = dizi[i];
    }

    //Sayı sıfırdan büyükse 
    if(k > 0)
        return Radix_Sort(c, p);
    return c;
}

Proje dosyasını buradan indirebilirsiniz.

 

PHP

$d = Radix_Sort(array(56, 1002, 24, 1, 256));

for ($i=0; $i < count($d); $i++) { 
	echo $d[$i] . ' ';
}

function Radix_Sort($dizi, $b = 1) {
    $a = array();
    $c = array();

    $i = 0; $ra = 0; $p =  $b * 10; $k = 0;

    //a dizisini 0'la
    for ($i=0; $i < 10; $i++) { 
    	$a[$i] = 0;
    }

    //Rakamlara göre say
    for ($i = 0; $i < count($dizi); $i++){
        $ra = intval(($dizi[$i] % $p) / $b);

        //Kaçıncı basamağındaysa en büyük sayıyı al
        if(intval($dizi[$i] / $p) > $k)
            $k = intval($dizi[$i] / $p);
        $a[$ra]++;
    }

    //n = n + (n - 1)
    for ($i = 1; $i < count($a); $i++){
        $a[$i] += $a[$i - 1];
    }

    //a daki indexlere göre sayıları sırala
    for ($i = count($dizi) - 1; $i >= 0; $i--){
        $ra = intval(($dizi[$i] % $p) / $b);
        $c[--$a[$ra]] = $dizi[$i];

    }

    //Sayı sıfırdan büyükse 
    if($k > 0)
        return Radix_Sort($c, $p);
    return $c;
}

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

Merge Sort (Birleştirmeli Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Merge Sort algoritması parçala (böl) ve yönet tekniğiyle yapılır. İlk önce dizi iki parçaya bölünür. Diğer parçalar kendi aralarında bölünür. Her parçadan bir tane kalana kadar bölünürler.

Elimizde şu şekilde bir dizimiz olsun.

SnapCrab_No-0041

 

Dizi son 1 elemanı kalana kadar kendi arasında ikiye bölünür.

SnapCrab_No-0042

 

Sonra bölünen kısımlar kendi aralarında sıralanarak birleştirilir.

SnapCrab_No-0043

 

Ve böylece dizimiz sıralanmış olur. Bu işlemi koda dökelim.

Burada özyineleme işlemi vardır. Her parça kendi arasında hep ikiye bölünmektedir. Bunun için recursive fonksiyon olarak yazalım. Dizimiz bölünerek sağ ve sol olarak iki diziye ayrılmaktadır.Bu sağ ve sol dizide bir eleman kalana kadar bölünmeye devam etmektedir.

int[] Merge_Sort(int[] d)
{
	//Dizi boyutu 2'den küçükse yani 1 olmuş geriye diziyi döndür.
	if (d.Length < 2)
    	return d;

    int bol = d.Length / 2;

    //Sol ve sağ kısımların tanımlanması
    int[] sol = new int[bol];
    int[] sag = new int[d.Length - bol];

    //Sol diziyi doldur
    for (int i = 0; i < bol; i++){
        sol[i] = d[i];
    }

    //Sağ diziyi doldur
    int k = 0;
    for (int i = bol; i < d.Length; i++){
        sag[k] = d[i];
        k++;
    }

    //Sağ ve sol dizileri parçala
    sol = Merge_Sort(sol);
    sag = Merge_Sort(sag);
}

Parçalanan kısımların kendi aralarında sıralanıp birleştirme işleminin yapılması gerekir. Bunun içinde Birlestir adında bir fonksiyon yazalım. Gelen iki parça kendi aralarında karşılaştırılacak ve birleştirilecek. Bu işlemde bakılmayan elemanlar dizinin sonuna eklenecektir.

int[] birlestir(int[] sol, int[] sag) {
	//Birleştirilen dizi iki dizinin toplam boyutunda olmalı
	int[] a = new int[sol.Length + sag.Length];

    //Sol dizi için j index sayacı, Sağ dizi için i index sayacı, a dizisi için k index sayacı tanımlanmıştır.
    int i = 0, j = 0, k = 0;

    //İki diziyi karşılaştır. Küçük olan elemanları a dizisine ekle eklenen dizilerin indexlerini 1 arttır.
    while (j < sol.Length && i < sag.Length)
        a[k++] = (sag[i] < sol[j])? sag[i++] : sol[j++];

    //Sağ dizisinde eleman kaldıysa a dizisinin sonuna ekle
    while (i < sag.Length)
        a[k++] = sag[i++];

    //Sol dizisinde eleman kaldıysa a dizisinin sonuna ekle
    while (j < sol.Length)
        a[k++] = sol[j++];

    //Sıralanan ve birleştirilen diziyi geri döndür
    return a;
}

Birleştirme işlemi için fonksiyonumuzu yazdık şimdi bu fonksiyonumuzu Merge_Sort fonksiyonunda çağıralım.

int[] Merge_Sort(int[] d)
{
	//Dizi boyutu 2'den küçükse yani 1 olmuş geriye diziyi döndür.
	if (d.Length < 2)
    	return d;

    int bol = d.Length / 2;

    //Sol ve sağ kısımların tanımlanması
    int[] sol = new int[bol];
    int[] sag = new int[d.Length - bol];

    //Sol diziyi doldur
    for (int i = 0; i < bol; i++){
        sol[i] = d[i];
    }

    //Sağ diziyi doldur
    int k = 0;
    for (int i = bol; i < d.Length; i++){
        sag[k] = d[i];
        k++;
    }

    //Sağ ve sol dizileri parçala
    sol = Merge_Sort(sol);
    sag = Merge_Sort(sag);

    //Parçaları sırala ve birleştir ve sıralanan diziyi geri döndür
    return birlestir(sol, sag);
}

Artık Merge_Sort fonksiyonumuzu çağırarak sıralama işlemini yaptırabiliriz.

int[] d = Merge_Sort(new int[]{10, 5, 1, 2, 20, 15});

for (int i = 0; i < d.Length; i++){
    Console.Write(d[i] + " ");
}

Proje dosyasını buradan indirebilirsiniz. (Büyükten küçüğe doğru sıralama yapar.)

PHP

$d = Merge_Sort(array(10, 5, 1, 2, 20, 15));

for ($i=0; $i < count($d); $i++) { 
    echo $d[$i] . ' ';
}

function Merge_Sort($d = array())
{
	//Dizi boyutu 2'den küçükse yani 1 olmuş geriye diziyi döndür.
	if (count($d) < 2)
    	return $d;

    //Tek sayıysa 1 fazlasını al
    $n = 0;
    if(count($d) % 2 == 1)
        $n = count($d) + 1;
    else
        $n = count($d);

    $bol = $n / 2;

    //Sol ve sağ kısımların tanımlanması
    $sol = array();
    $sag = array();

    //Sol diziyi doldur
    for ($i = 0; $i < $bol; $i++){
        $sol[$i] = $d[$i];
    }

    //Sağ diziyi doldur
    $k = 0;
    for ($i = $bol; $i < count($d); $i++){
        $sag[$k] = $d[$i];
        $k++;
    }

    //Sağ ve sol dizileri parçala
    $sol = Merge_Sort($sol);
    $sag = Merge_Sort($sag);

    //Parçaları sırala ve birleştir ve sıralanan diziyi geri döndür
    return birlestir($sol, $sag);
}

function birlestir($sol, $sag) {
	//Birleştirilen dizi iki dizinin toplam boyutunda olmalı
	$a = array();

    //Sol dizi için j index sayacı, Sağ dizi için i index sayacı, a dizisi için k index sayacı tanımlanmıştır.
    $i = 0; $j = 0; $k = 0;

    //İki diziyi karşılaştır. Küçük olan elemanları a dizisine ekle eklenen dizilerin indexlerini 1 arttır.
    while ($j < count($sol) && $i < count($sag))
        $a[$k++] = ($sag[$i] < $sol[$j])? $sag[$i++] : $sol[$j++];

    //Sağ dizisinde eleman kaldıysa a dizisinin sonuna ekle
    while ($i < count($sag))
        $a[$k++] = $sag[$i++];

    //Sol dizisinde eleman kaldıysa a dizisinin sonuna ekle
    while ($j < count($sol))
        $a[$k++] = $sol[$j++];

    //Sıralanan ve birleştirilen diziyi geri döndür
    return $a;
}

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

Bubble Sort (Baloncuk veya Kabarcık Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Bubble Sort algoritması seçilen 1. elemanın, bir sonraki elemanla karşılaştırılıp; sonra diğer elemanların, bir sonraki elemanla karşılaştırılarak devam eder. Karşılaştırılan eleman ve sonraki eleman küçük veya büyükse (sıralamaya göre) yer değiştirir. Bu döngü sona geldiğinde sıralama olmadıysa veriler sıralanana kadar baştan sona devam eder.

Bir A dizimiz olsun. Bu diziyi büyükten küçüğe doğru sıralayalım.

SnapCrab_No-0039

İlk eleman seçilip bir sonraki elemanla karşılaştırılır. Sonraki eleman küçükse yer değiştirilir. Sonra ikinci eleman seçilip sonraki eleman karşılaştırılır. Sonra üçüncü eleman seçilir bu şekilde devam eder.

SnapCrab_No-0038

Sıralama tamamlandığında döngü sonlandırılır.

SnapCrab_No-0040

Burada dikkat edilirse ilk döngüde en büyük olan sayı sona gelir.

İkinci döngüde ise sondaki sayının bir küçüğü sondan ikinci olur.

Dizi sayısına n dersek:

n, (n-1), (n-2) … şeklinde döngü tekrarlanır.

Bu algoritmayı koda dökersek eğer ilk önce eleman seçmek için bir döngü yazalım. Bir sonraki elemanla karşılaştırıldığı için döngü dizi uzunluğunun – 1 sonucuna kadar dönmelidir. Elemanları karşılaştırıp sonraki eleman, seçilen elemandan küçükse yer değiştirmelidir.

int[] a = new int[]{17, 3, 1, 5, 45}

for (int i = 0; i < a.Length - 1; i++)
{
    if (a[i + 1] < a[i]) {
        int temp = a[i];
        a[i] = a[i + 1];
        a[i + 1] = temp;
    }
}

Tabiki bu döngü bir defa dönmeyeceği için bir sonsuz döngünün içinde yazmamız gerekir. Veriler sıralanana kadar bu döngü hep tekrarlanmalıdır. Bunun için bir kontrol yazmalıyız. Yer değişmediği zaman döngüden çıkmalıdır.

int[] a = new int[]{17, 3, 1, 5, 45}

while (true) {
	bool degisti = false;

	for (int i = 0; i < a.Length - 1; i++)
	{
	    if (a[i + 1] < a[i]) {
	        int temp = a[i];
	        a[i] = a[i + 1];
	        a[i + 1] = temp;
	        degisti = true;
	    }
	}

	if (!degisti)
        break;
}

n, n-1, n-2… şeklinde kodu düzenleyelim. Bir daha sıralanmış verileri kontrol etmemesi gerekir.

int[] a = new int[]{17, 3, 1, 5, 45}
int n = a.Length;

while (true) {
	bool degisti = false;

	for (int i = 0; i < n - 1; i++)
	{
	    if (a[i + 1] < a[i]) {
	        int temp = a[i];
	        a[i] = a[i + 1];
	        a[i + 1] = temp;
	        degisti = true;
	    }
	}

	n--;

	if (!degisti)
        break;
}

Proje dosyasını buradan indirebilirsiniz.

PHP

$a = array(17, 3, 1, 5, 45);
$n = count($a);

while (true) {
	$degisti = false;

	for ($i = 0; $i < $n - 1; $i++)
	{
	    if ($a[$i + 1] < $a[$i]) {
	        $temp = $a[$i];
	        $a[$i] = $a[$i + 1];
	        $a[$i + 1] = $temp;
	        $degisti = true;
	    }
	}

	$n--;

	if (!$degisti)
        break;
}

//Ekrana sıralanmış diziyi yaz
for ($i=0; $i < count($a); $i++) { 
	echo $a[$i] . ' ';
}

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.