Sıralama (Sorting) Algoritmaları

w1sd0m

Katılımcı Üye
28 Mar 2020
699
626
/802.1x/
il0mm59.png


---> SORTING ALGORITHMS <---
" Sıralama Algoritmaları "



wdklyzt.png



Merhaba dostlarım, bu gün sizlere üzerinde çokça kafa yorulan algoritmalardan biri olan:
Sıralama Algoritmaları
konusunu anlatacağım.
Foruma katkısı ve bu alanda bilgi sahibi olmak isteyen arkadaşlara faydalı olması dileğiyle başlamak istiyorum.

İyi okumalar.


|

|
v


Sıralama Algoritması nedir?


28lxkv0.png


Sorting Algorithms (Sıralama Algoritmaları); alfabetik harf yada sayı içeren array(dizi) veya list(liste) şeklindeki verileri, ascend(küçükten büyüğe) veya descend(büyükten küçüğe) biçiminde sıralamamıza yarayan algoritmalardır.

Sıralama yapmak ne kadar bizlere kolay bir eylem gibi gelsede arka planda çok fazla işlem yapıldığından, en iyi performansı sağlayacak algoritmalar yıllardır geliştirilmekte ve geliştirilmeye devam edilmektedir.

Araştırmalarıma göre, üzerinde en fazla kafa yorulan ve uğraşılan algortimalar arasında üst sıradadırlar. Aslında bunun sebebini biraz düşünüp anlayabiliriz. Şöyleki; büyük dosyalarda sıralama işlemi yaparken en kısa sürede sıralamak için en hızlı yolu bulmamız gerekir. Ancak algoritma daha hızlı çalışmak istediğinde daha fazla bellek kullanmak durumunda kalır.Diğer yandan, bellek sıkıntısı olan işlemlerde minimum bellek kulanmak isteyebiliriz. Bu kez ise minimium bellek kullandığından algoritma yavaş çalışacaktır. Sonuç olarak geliştiricilerin, hem en hızlı işlem yapabilen hemde en az bellek kullanan bir algoritma geliştirmek istemeleri gayet mantıklı bir durumdur.

Bir sıralama algoritması geliştirilirken birden fazla performans kriterine bakılsada, genel olarak iki kriterde yoğunlaşıldığını görüyoruz.
Bunlar;

Time-Complexity(Zaman karmaşıklığı) ve Space-Complexity(Alan/Hafıza Karmaşıklığı) olarak 2 temel kriterdir.

Zaman karmaşıklığı, algoritmanın hızlı çalışabilmesi yönü iken,

Alan karmaşıklığı, algoritmanın bellek performansı yönüdür.

il0mm59.png


Evet dostlarım, temel olarak Sıralama algoritması nedir, neye yarar? konusunda fikir sahibi oldunuz.

Şimdi konuyu biraz daha irdeleyelim.

Birçok sıralama algoritması geliştirilmiş. Aşağıya bazılarını listeleyeceğim ve bunlardan bir kaçının işleyişini ve kodlarını göstereceğim.

----------------------------------------------------------------
Stooge Sort
Bubble Sort
Cocktail Sort
Merge Sort
Quick Sort
ShellSort
Selection Sort
Recursive Bubble Sort
Insertion Sort
Gnome Sort
Heap Sort
Counting Sort
Radix Sort
Bucket Sort
TimSort
Comb Sort
Pigeonhole Sort
Cycle Sort
Strand Sort
Iterative Merge Sort
Iterative Quick Sort
Bitonic Sort
Pancake sorting
QuickSort on Singly Linked List
QuickSort on Doubly Linked List
Sleep Sort – The King of Laziness / Sorting while Sleeping
Structure Sorting (By Multiple Rules) in C++
Tag Sort (To get both sorted and original)
Tree Sort
Cartesian Tree Sorting
Odd-Even Sort / Brick Sort
Recursive Insertion Sort
Binary Insertion Sort
BogoSort or Permutation Sort
Merge Sort for Linked Lists
Merge Sort for Doubly Linked List
3-Way QuickSort (Dutch National Flag)
3-way Merge Sort
----------------------------------------------------------------


1 – Stooge Sort (Serseri Sıralaması)



i3n2k8u.png


Serseri sıralama algoritması, sıralama algoritmaları içerisinde zaman karmaşıklığı en sıkıntılı olan algoritmalardan biridir. Yani epek bi yavaş çalıştığını söyleyebilirim.

Algoritma, veri listesinin ilk elemanı son elemanından büyükse bu iki veriyi yer değiştirmektedir. Bu 2’li veri listesinde olurken, veri listesinin eleman sayısı 3 veya daha fazla olduğu zaman ise; algoritma ilk olarak listenin baştan 2/3’ünü sıralar, sonra listenin sondan 2/3’ünü sıralar, son olarak listenin baştan 2/3’ünü tekrardan sıralar.

Ancak önemli bir nokta var ve o da; kullanılan sıralama boyutu tam sayı olduğu zaman,
2/3 değerini yukarı yuvarlayarak hesaplamamız gerektiğidir. Aksi halde hatalar ile karşılaşılabiliyor.

Peki nedir bunun meali;

{9,1,7,3,5} -> Başlangıçtaki veri listemiz olsun.

1.aşamada: Algoritma, öncelikle ilk veriyi ve son veriyi karşılaştırır. Burada 9>5 olduğundan bu iki veri yer değiştirir.
{5,1,7,3,9} olarak düzenlendi.

2.aşamada: Bu işlemde algoritma, listenin baştan 2/3’ünü alır ve sıralar.
{(5,1,7),3,9} -> {1,5,7,3,9} olarak sıralanır.

3.aşamada: Şimdiki işlemde ise, listenin sondan 2/3’ü alınır ve sıralanır.
{1,5,(7,3,9)} -> {1,5,3,7,9} olarak sıralanır.

4.aşamada: Son işlem olarak, listenin tekrardan baştan 2/3’ü alınır ve sıralanır.
{(1,5,3),7,9} -> {1,3,5,7,9} olarak sıralanır ve işlem bitirilir.


Mantık bu dostlarım.
Örnek bir
Python3 kodu bırakıyorum buraya.


Zaman ve bellek performanslarını konu sonunda tablo şeklinde vereceğim. Detaylarına bakar, hangisi hızlı hangisi az bellek ihtiyacı duyuyor siz karar verirsiniz.

Python:
#w1sd0m
def stoogesort(arr, l, h):
    if l >= h:
        return
    # Baştaki veri sondaki veriden büyük ise bunlar yer değiştirir.
    if arr[l]>arr[h]:
        t = arr[l]
        arr[l] = arr[h]
        arr[h] = t

    # Eğer listenin veri sayısı 2'den büyük olduğunda;
    if h-l + 1 > 2:
        t = (int)((h-l + 1)/3)

        # listenin baştan 2/3'ü sıralanır
        stoogesort(arr, l, (h-t))

        # listenin sondan 2/3'ü sıralanır
        stoogesort(arr, l + t, (h))

        # tekrardan listenin baştan 2/3'ü sıralanır ve işlem tamamlanır.
        stoogesort(arr, l, (h-t))

# üretim
arr = [2, 4, 5, 3, 1]
n = len(arr)
stoogesort(arr, 0, n-1)
for i in range(0, n):
    print(arr[i], end = ' ')


2 – Bubble Sort (Baloncuk/Kabarcık Sıralaması)


6jc4d6h.png


Baloncuk sıralama algoritması, sıralama algoritmaları içerisinde en basit olan algoritmalardan birisidir. O yüzden anlatması ve anlaşılması kolaydır.

Bu algoritmada, listemizdeki her bir elemanı (ilk elemandan başlayarak) yanındaki diğer eleman ile karşılaştırır ve 2. Sayı ilk sayıdan küçükse bunları yer değiştirir. Ve bir diğer elemana geçer.

Nedir bunun meali;

{3,5,1,7,2,9,8} -> Başlangıçtaki veri listemiz olsun.

1.aşamada: İndex=0(3,ilk eleman) seçilir ver yanındaki sayı ile karşılaştırılır. Eğer yanındaki sayı kendisinden küçükse, bu iki değer birbiri ile yer değiştirir.

2.aşamada: {3,1,5,2,7,8,9},

3.aşamada: {1,3,2,5,7,8,9},

4.aşamada: {1,2,3,5,7,8,9} olarak işlem tamamlanır.


Mantık budur dostlarım.
Örnek bir
Python3 kodu bırakıyorum buraya.


Python:
#w1sd0m
def bubbleSort(arr):
    n = len(arr)
    # Liste dolaşılır
    for i in range(n):
        swapped = False
        for j in range(0, n-i-1):
            # İlk elemandan başlayarak, her eleman yanındaki eleman ile karşılaştırılır ve sağındaki elemandan büyük ise bunlar yer değiştirir
            if arr[j] > arr[j+1] :
                arr[j], arr[j+1] = arr[j+1], arr[j]
                swapped = True

        # Karşılaştıracak iki eleman kalmazsa işlemi durdur
        if swapped == False:
            break
        
arr = [64, 34, 25, 12, 22, 11, 90]
print("Normal liste: ",arr)
bubbleSort(arr)
print ("Düzenlenmiş liste:")
for i in range(len(arr)):
    print ("%d" %arr[i],end=" ")


3 – Cocktail/Shaker Sort (Sallama sıralaması)


m3ww9kq.png


Sallama sıralama algoritması, yukarıda anlattığım Baloncuk sıralama algoritmasının bir üst seviyesidir diyebilirim. Bu algoritma, baloncuk sıralamasını çift yönlü işlem hareketiyle daha etkili ve hızlı hale getirmiştir.

Algoritma, sıralama işlemini 2 adımda bitirir.

İlk adım tıpkı baloncuk sıralama algoritması gibi liste, baştan sona doğru dolaşılır ve her ikili birbiriyle kıyaslanır, küçük-büyük olacak şekilde sıralanır. Bu sıralama sonunda listenin en büyük elemanı en sonda bulunur.

İkinci adımda ise, listenin sondan bir önceki elemanından başlanılarak liste başına doğru dolaşılır ve tekrardan her ikili birbiri ile kıyaslanır ve sıralanır.

Nedir bunun meali;

{7,2,5,1,9,8,4} -> Başlangıçtaki veri listemiz olsun.

1.aşamada: Algoritma, ilk aşamayı baloncuk sıralama algoritması işleyişi ile tamamlar. Yukarıda(Baloncuk sıralaması) detayına indiğim için sadece göstereceğim.
{7,2,5,1,9,8,4} -> {2,5,1,7,8,4,9} olarak sıralanır ve ilk aşama tamamlanır.

2.aşamada: Sondan önceki veriden başlayarak başa doğru dolaşılır ve karşılaştırılıp sıralanır.
{2,5,1,7,8,4,9} -> {2,5,1,7,4,8,9} -> {2,5,1,7,4,8,9} -> {2,5,1,4,7,8,9}-> {2,1,5,4,7,8,9}-> {1,2,5,4,7,8,9} -> {1,2,4,5,7,8,9} olarak sıralanır ve işlem bitirilir.


Mantık budur dostlarım.
Örnek bir
Python3 kodu bırakıyorum buraya.


Python:
#w1sd0m
def cocktailSort(a):
    n = len(a)
    swapped = True
    start = 0
    end = n-1
    while (swapped == True):
        swapped = False

        # Burada, bubble(baloncuk) algoritması işlemi uygulanır
        for i in range(start, end):
            if (a[i] > a[i + 1]):
                a[i], a[i + 1] = a[i + 1], a[i]
                swapped = True

        # Eleman kalmazsa işlem bitirilir
        if (swapped == False):
            break

        # Flagı sıfırlar, işlemi optimize eder
        swapped = False

        # Sondan bir önceki elemandan başlayarak listeyi başa doğru dolaşacaktır
        end = end-1

        # Burada önceki yer değiştirme işlemini tersine uygular
        for i in range(end-1, start-1, -1):
            if (a[i] > a[i + 1]):
                a[i], a[i + 1] = a[i + 1], a[i]
                swapped = True

        # Başlangıç değerini artırır, böylece işlem tamalanıncaya kadar devam eder
        start = start + 1

a = [5, 1, 4, 2, 8, 0, 2]
print("Normal liste: ",a)
cocktailSort(a)
print("Düzenlenmiş liste:")
for i in range(len(a)):
    print("% d" % a[i])


4 – Merge Sort (Birleştirme Sıralaması)


soayb2t.png


Birleştirme sıralama algoritması, veri listesini önce adım adım eş parçalara ayırır, sonra bu parçaları kendi içerilerinde sıralar, sonra tek bir parça haline getirir ve bu işlemi yaparken tekrar sıralar. Yani önce parçalar sonra bütünler.

Nedir bunun meali;

{3,5,8,1,5,4,7,9} -> Başlangıçtaki veri listemiz olsun.

1.aşamada: Algoritma ilk aşamada bu listeyi iki eş parçaya böler. Daha sonra oluşan listeleri tekrar 2’şer eş parçaya böler ve ne zaman listelerde 2 yada daha az sayıda eleman bulunursa o zaman işlemi sonlandırır ve ikinci bölüme geçer.

2.aşamada: {3,5,8,1}{5,4,7,9}

3.aşamada: {3,5}{8,1}{5,4}{7,9}
Daha sonra ayrılan bu veriler kendi aralarında sıralanır ve birleştirilip tek liste haline getirilir ve son olarak birde orada sıralanır.

4.aşamada: {3,5}{1,8}{4,5}{7,9}

5.aşamada: {1,3,5,8}{4,5,7,9}

6.aşamada: {1,3,4,5,5,7,8,9} olarak işlem tamamlanır.


Mantık budur dostlarım.
Örnek bir
Python3 kodu bırakıyorum buraya.


Python:
#w1sd0m
def mergeSort(arr):
    if len(arr) > 1:
        # Listenin ortasındaki eleman bulunur
        mid = len(arr)//2
        # Elemanları ayırır
        L = arr[:mid]
        R = arr[mid:]
        # İlk grup sıralanır
        mergeSort(L)
        # İkinci grup sıralanır
        mergeSort(R)
        i = j = k = 0

        # Oluşan elemanları 2 listeye gruplar
        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1

        # Solda eleman kalıp kalmadığını kontrol eder
        while i < len(L):
            arr[k] = L[i]
            i += 1
            k += 1
        # Sağda eleman kalıp kalmadığını kontrol eder
        while j < len(R):
            arr[k] = R[j]
            j += 1
            k += 1

# Tekrar liste haline getirilir
def printList(arr):
    for i in range(len(arr)):
        print(arr[i], end=" ")
    print()

if __name__ == '__main__':
    arr = [12, 11, 13, 5, 6, 7]
    print("Normal liste:", end="\n")
    printList(arr)
    mergeSort(arr)
    print("Düzenlenmiş liste: ", end="\n")
    printList(arr)


5 – Quick Sort (Hızlı Sıralama)

qi6g128.png

Hızlı sıralama algoritması, zaman taraflı performans derecesi yüksek olan algoritmalardan birisidir. Son derece hızlı çalıştığını söyleyebilirim.

Algoritma, önce veri listesinin
tam ortasındaki değeri(elemanı) belirler daha sonra tüm listeyi bu elemana göre gözden geçirir.Seçilen bu sayıdan(pivot) küçük olanlar sol sayının sol tarafına, büyük olanlar ise sayının sağ tarafına konulur.Liste böylece iki farklı liste haline gelir ve tekrardan bu listeler aynı işleme tabi tutulur. Sıralama tamamlanana kadar bu işlem sürer. Sıralama tamamlanınca birleştirme işlemi yapılır ve tekrardan tek bir liste elde edilir.

Nedir bunun meali;

{51,13,45,30,33,29,7} -> Başlangıçtaki veri listemiz olsun.

1.aşamada: İlk aşamada listenin ortasındaki değer bulunur. Burada değerimiz “30” oluyor. Şimdi 30’dan küçük sayıları sol tarafa, büyük sayıları ise sağ tarafa alarak iki liste oluşturalım.
30
{13,29,7}{51,45,33}

2.aşamada: Tekrar bu listelere aynı işlemi uygulayalım.
29 45
{7,13} {33,51} olarak sıralanır.

3.aşamada: Bu adımdan sonra listelerde 2 veya daha az eleman kaldığından parçalama işlemi bitirilir ve birleştirme işlemine geçilir.
Birleştirme işlemi ise, 2.aşamadaki veriler birleştirilir
{7,13,33,51},
daha sonra 1.aşamadakiler birleştirilir {7,13,29,33,45,51},
son işlem olarak ise tüm liste tekrar birleştirilir ve {7,13,29,30,33,45,51} olarak işlem tamamlanır.


Mantık budur dostlarım.
Örnek bir
Python3 kodu bırakıyorum buraya.


Python:
#w1sd0m
def partition(start, end, array):
    # Listenin ortasındaki eleman(pivot) belirlenir
    pivot_index = start
    pivot = array[pivot_index]
    # Liste döngüye alınır
    while start < end:
        # Seçilen elemandan büyük bir eleman bulana kadar sayıyı arttırır
        while start < len(array) and array[start] <= pivot:
            start += 1
        # Seçilen elemandan küçük bir eleman bulana kadar sayıyı azaltır
        while array[end] > pivot:
            end -= 1
        # Son değer pivottan büyük ise bunlar yer değiştirir
        if(start < end):
            array[start], array[end] = array[end], array[start]
    # Pivot değeri ile son değer yer değiştirir
    array[end], array[pivot_index] = array[pivot_index], array[end]
    # Dizi tekrar bölünmek üzere döndürülür
    return end
    
def quick_sort(start, end, array):
    if (start < end):
        p = partition(start, end, array)
        quick_sort(start, p - 1, array)
        quick_sort(p + 1, end, array)


array = [ 10, 7, 8, 9, 1, 5 ]
print("Normal liste: ",array)
quick_sort(0, len(array) - 1, array)
print(f'Düzenlenmiş liste: {array}')


6 – Shell Sort (Kabuk Sıralaması)


b2wlngp.jpg


Kabuk sıralama algoritması, hızlı sıralama algoritması gibi performansı yüksek algoritmalardan birisidir. Algoritmanın adı “Donald Shell” adında bu algoritmayı yazan abimizden gelmektedir. Türkçe’ye “kabuk” diye çevrilmiş olmasına şaşırmamakla birlikte gelin işleyişe geçelim.

Algoritma, öncelikle bizden bir
sıçrama değeri(gap) ister, Bu sıçrama değerine göre listeyi kolonlara böler.Yani aslında bize,bu listeyi kaç adet kolona böleyim diye sorar. Daha sonra bu kolonlar arasında bir sıralama işlemi yapılır. Sonra sıralanan kolonlar tekrardan yan yana yazılır ve tek liste haline gelir. Ardından, sıçrama değeri yarıya indirilir ve tekrar kolonlara bölünür. Tekrardan bu kolonlar kendi aralarında sıralanır ve sıralanan kolonlar birleştirilir ve tek liste halini alır. Son olarak liste tekrardan tek karakter baz alınarak sıralanır ve işlem bitirilir.

Nedir bunun meali;

{ 6, 8, 9, 1, 3, 7 , 8 , 10 , 11 , 2 ,1 , 3} -> Başlangıçtaki veri listemiz olsun.

1.aşamada: İlk aşamada bir sıçrama değeri belirleyelim. Değerimiz “4” olsun. Liste 4 kolona bölünür.
6, 8, 9, 1,
3, 7, 8, 10,
11, 2, 1, 3,

2.aşamada: Her kolon kendi aralarında sıralama işlemine sokulur.
3, 2, 1, 1,
6, 7, 8, 3,
11, 8, 9, 10,

3.aşamada: Kolonlar birleştirilir ve liste haline getirilir.
{3,2,1,1,6,7,8,3,11,8,9,10}

4.aşamada: Bu aşamada sıçrama değeri yarıya indirilir ve liste tekrardan kolonlara bölünür.
3, 2,
1, 1,
6, 7,
8, 3,
11, 8,
9, 10,

5.aşamada: Kolonlar kendi içerisinde tekrardan sıralama işlemine sokulur.
1, 1,
3, 2,
6, 3,
8, 7,
9, 8,
11, 10,

6.aşamada: Kolonlar birleştirilir ve liste haline getirilir ve son kez tekar sıralama işlemi görür.
{1,1,3,2,6,3,8,7,9,8,11,10} -> {1,1,2,3,3,6,7,8,8,9,10,11} olarak hazırlanır ve işlem bitirilir.


Mantık budur dostlarım.
Örnek bir Python3 kodu bırakıyorum buraya.

Python:
#w1sd0m
def shellSort(arr):
    # sıçrama değeri = gap
    gap = len(arr) // 2
    while gap > 0:
        i = 0
        j = gap
        # listeyi dolaşır ve gap değerince kolona böler
        while j < len(arr):
            if arr[i] >arr[j]:
                arr[i],arr[j] = arr[j],arr[i]
            i += 1
            j += 1

            # veriler doğru sıraya sokulur.
            k = i
            while k - gap > -1:
                if arr[k - gap] > arr[k]:
                    arr[k-gap],arr[k] = arr[k],arr[k-gap]
                k -= 1
        gap //= 2

arr2 = [12, 34, 54, 2, 3]
print("İlk liste: ",arr2)

shellSort(arr2)
print("Düzenlenmiş liste: ",arr2)


il0mm59.png


Evet dostlarım, “Sıralama Algoritmaları” adlı makalemin sonuna geldik.
Konunun önemli olduğunu düşünüyorum.
Aklınıza takılan bir konu olursa destek olacağımı bilmenizi isterim.
İyi forumlar :)


Son olarak, bu algoritmaların
performans tablosunu aşağıya bırakıyorum. İnceleyebilirsiniz.

Ayrıca, bıraktığım bu Python3 kodlarını mutlaka farklı listeler ile çalıştırın. Böylece kendi testlerinizi gerçekleştirmiş olursunuz.

|
|
v

d01kri1.png


^
|
|



il0mm59.png

 

'Eşref

Özel Üye
17 Ara 2021
1,148
1,706
Ellerine sağlık gayet başarılı bir konu olmuş.Devamını merakla bekliyorum.
 

w1sd0m

Katılımcı Üye
28 Mar 2020
699
626
/802.1x/

Eline sağlık hocam,gayet güzel bir anlatım olmuş.

Ellerine sağlık gayet başarılı bir konu olmuş.Devamını merakla bekliyorum.

Ellerinize sağlık


Eline sağlık kardeşim :)

Elinize Emeğinize sağlık, güzel konu.
Teşekkürler dostlarım.
Devamı için beklemede kalın. Algoritmaları halledeceğiz yavaş yavaş :)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.