Veri Yapıları ve Programlama

11 - Sıralama Algoritmaları

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2025

Sıralama Algoritmaları

Sıralama algoritması, bir dizinin/listenin öğelerini belirli bir sıraya göre düzenlemek için kullanılır. Örnekte artan sırada sıralama yapılmış.

Sıralama Algoritmaları

  • Seçerek Sıralama (Selection Sort)
  • Baloncuk Sıralama (Bubble Sort)
  • Ekleme Sıralama (Insertion Sort)
  • Hızlı Sıralama (Quick Sort)
  • Birleştirme Sıralama (Merge Sort) …

Seçerek Sıralama (Selection Sort)

Bir döngü içerisinde, her adımda dizideki en küçük değerli sayıyı bulan, bulduğu en küçük sayıyı döngüdeki mevcut sayıyla yer değiştiren algoritmadır.

Seçmeli Sıralama da denilebilir.

Çalışma Prensibi

  1. İlk elemanı en küçük eleman olarak ayarlayın.
  1. En küçük eleman ile ikinci elemanı karşılaştırın. İkinci eleman en küçük elemandan küçükse, ikinci elemanı en küçük eleman olarak atayın. En küçük ile üçüncü elemanı karşılaştırın. Yine, üçüncü eleman daha küçükse, en küçük değeri üçüncü elemana atayın, aksi takdirde hiçbir şey yapmayın. İşlem son elemana kadar devam eder.

3.Her iterasyondan sonra en küçük eleman, sıralanmamış listenin önüne yerleştirilir.

  1. Her bir iterasyon için indeksleme, ilk sıralanmamış elemandan başlar. Tüm elemanlar doğru konumlarına yerleştirilene kadar 1. adımdan 3. adıma kadar tekrarlanır.

Alıştırma Sorusu:

35, 40, 25, 10, 45 sayıları seçerek sıralama algoritmasıyla küçükten büyüğe sıralanmak isteniyor. Kaçıncı adımda sayılar sıralanmış olur?

  1. 1 B) 2 C) 3 D) 4 E) 5

C ile Gerçekleme

https://gist.github.com/ecylmz/68f7646b1805c623db1b553867ef8585#file-selection-sort-c

Baloncuk Sıralama (Bubble Sort)

Sıralanacak dizinin üzerinde sürekli ilerlerken her defasında iki öğenin birbiriyle karşılaştırılıp, karşılaştırılan öğelerin yanlış sırada olmaları durumunda yerlerinin değiştirilmesi mantığına dayanan, herhangi bir değişiklik yapılmayıncaya kadar dizinin başına dönerek kendisini yineler.

Çalışma Prensibi

Elemanları artan sırada sıralamaya çalıştığımızı varsayalım.

İlk iterasyon (yineleme) (Kıyasla ve Yer Değiştir)

  1. İlk indeksten başlayarak, birinci ve ikinci elemanları karşılaştırın.
  2. İlk eleman ikinci elemandan büyükse, bunlar yer değiştirilir.
  3. Şimdi, ikinci ve üçüncü öğeleri karşılaştırın. Sıralı değillerse yerlerini değiştirin.
  4. Yukarıdaki işlem son elemana kadar devam eder.

Kalan iterasyonlar

Aynı süreç kalan iterasyonlar için de devam eder.

Her iterasyondan sonra, sıralanmamış elemanlar arasındaki en büyük eleman en sona yerleştirilir.

Her yinelemede, karşılaştırma sıralanmamış son öğeye kadar gerçekleşir.

Sıralanmamış tüm elemanlar doğru konumlarına yerleştirildiğinde dizi sıralanmış olur.

C ile Gerçekleme

https://gist.github.com/ecylmz/68f7646b1805c623db1b553867ef8585#file-bubble-sort-c

Ekleme Sıralama (Insertion Sort)

  • Ekleme sıralaması, sıralanmamış bir elemanı her iterasyonda uygun yerine yerleştiren bir sıralama algoritmasıdır.

  • Ekleme sıralaması, bir kart oyununda elimizdeki kartları sıralamamıza benzer şekilde çalışır.

  • İlk kartın zaten sıralanmış olduğunu varsayıyoruz, sonra sıralanmamış bir kart seçiyoruz. Eğer sıralanmamış kart eldeki karttan büyükse sağa, değilse sola yerleştirilir. Aynı şekilde diğer sıralanmamış kartlar da alınır ve doğru yerlerine konur.

  • Benzer bir yaklaşım ekleme sıralaması tarafından da kullanılır.

Çalışma Prensibi

Aşağıdaki diziyi sıralamamız gerektiğini varsayalım.

  1. Dizideki ilk elemanın sıralı olduğu varsayılır. İkinci elemanı alın ve ayrı olarak anahtarda(key) saklayın.

    Anahtar(key) ile ilk elemanı karşılaştırır. İlk eleman anahtardan büyükse, anahtar ilk elemanın önüne yerleştirilir.

  1. Şimdi, ilk iki öğe sıralı halde!

    Üçüncü elemanı alın ve solundaki elemanlarla karşılaştırın. Kendisinden küçük olan elemanın hemen arkasına yerleştirin. Eğer ondan daha küçük bir eleman yoksa, dizinin başına yerleştirin.

  1. Benzer şekilde, sıralanmamış her öğeyi doğru konuma yerleştirin.

C ile Gerçekleme

https://gist.github.com/ecylmz/68f7646b1805c623db1b553867ef8585#file-insertion-sort-c

Hızlı Sıralama (Quick Sort)

Bir diziyi sıralamak için böl ve fethet yaklaşımını kullanan ve her adımda bir pivot elemanı seçerek diziyi pivot elemanının solunda küçük, sağında büyük olacak şekilde ikiye ayırarak devam eden bir sıralama algoritmasıdır.

Böl ve Fethet (Divide and Conquer)

Parçala ve fethet olarak da adlandırılan bu algoritma ile problem ufak ve çözülmesi nispeten daha kolay olan parçalara bölünür. Her parça ayrı ayrı çözüldükten sonra sonuçlar birleştirilerek genel problemin çözümü elde edilir.

Çalışma Prensibi

Pivot Elemanı Seçin

Pivot elemanın farklı konumlardan seçildiği farklı Hızlı Sıralama varyasyonları vardır. Burada, dizinin en sağdaki elemanını pivot eleman olarak seçeceğiz.

Diziyi Yeniden Düzenleyin

Şimdi dizinin elemanları, pivottan küçük olan elemanlar sola ve pivottan büyük olan elemanlar sağa gelecek şekilde yeniden düzenlenir.

İşte diziyi nasıl yeniden düzenlediğimiz:

  1. Pivot elemana bir işaretçi sabitlenir. Pivot eleman, ilk indeksten başlayan elemanlarla karşılaştırılır.
  1. Eleman pivot elemandan büyükse, bu eleman için ikinci bir işaretçi ayarlanır.
  1. Şimdi, pivot diğer elemanlarla karşılaştırılır. Pivot elemandan daha küçük bir elemana ulaşılırsa, küçük eleman daha önce bulunan daha büyük elemanla değiştirilir.
  1. Bir sonraki daha büyük elemanı ikinci işaretçi olarak ayarlamak için işlem tekrarlanır. Ve bunu başka bir küçük elemanla değiştirin.
  1. Süreç sondan 1 önceki elemana ulaşılana kadar devam eder.
  1. Son olarak, pivot elemanı ikinci işaretçi ile değiştirilir.

Alt Dizileri Böl

Pivot elemanlar yine sol ve sağ alt parçalar için ayrı ayrı seçilir. Ve 2. adım tekrarlanır.

Alt diziler, her alt dizi tek bir elemandan oluşana kadar bölünür. Bu noktada, dizi zaten sıralanmıştır.

C ile Gerçekleme

https://gist.github.com/ecylmz/68f7646b1805c623db1b553867ef8585#file-quick-sort-c

Birleştirme Sıralama (Merge Sort)

  • En popüler böl ve yönet algoritmalarından biridir.
  • Özyinelemeli(recursive) bir algoritmadır.
  • Diziyi ikiye böler.
  • Bu yarıya bölünmüş parçaları ayrı olarak (kendi içlerinde) sıralar
  • Sonra sıralanmış olan yarıya bölünmüş parçaları birleştirilmiş bir diziye çevirir.

Örnek

Sıralanmak istenen verimiz: 5,7,2,9,6,1,3,7 olsun. Birleştirme sıralamasının çalışması bu örnek dizi üzerinde adım adım gösterilmiştir. Öncelikle bölme adımları gelir.

  1. adım diziyi ikiye böl:

5,7,2,9 ve 6,1,3,7

  1. adım çıkan bu dizileri de ikiye böl:

5,7 ; 2,9 ; 6,1 ; 3,7

  1. adım elde edilen parçalar 2 veya daha küçük eleman sayısına ulaştığı için dur (aksi durumda bölme işlemi devam edecekti)
  1. adım her parçayı kendi içinde sırala

5,7 ; 2,9 ; 1,6 ; 3,7

  1. Her bölünmüş parçayı birleştir ve birleştirirken sıraya dikkat ederek birleştir (1. ve 2. parçalar ile 3. ve 4. parçalar aynı gruptan bölünmüştü)

2,5,7,9 ve 1,3,6,7

  1. adım, tek bir bütün parça olmadığı için birleştirmeye devam et

1,2,3,5,6,7,7,9

  1. adım sonuçta bir bütün birleşmiş parça olduğu için dur. İşte bu sonuç dizisi ilk dizinin sıralanmış halidir.

C ile Gerçekleme

https://gist.github.com/ecylmz/68f7646b1805c623db1b553867ef8585#file-merge-sort-c