İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Özel Ders Başvuru Ücretsiz ön görüşme Ana Sayfa

Insertion Sort Nasıl Çalışır? Eklemeli Sıralama Adım Adım Örnek

insertion-sort-nasil-calisir-eklemeli-siralama-adim-adim-ornek
Bu yazıda neler var?
  1. Insertion Sort nasıl çalışır?
  2. Dizi adım adım nasıl sıralanır?
  3. Python ile insertion sort nasıl yazılır?
  4. Zaman karmaşıklığı neden değişir?
  5. Kararlı sıralama ne anlama gelir?
  6. Hangi uygulama hatalarına dikkat edilmeli?
  7. Sık Sorulan Sorular

Insertion Sort, yani eklemeli sıralama, diziyi soldan sağa tarar ve her yeni elemanı kendisinden önceki sıralı bölümde uygun yere yerleştirir. Bu işlem, eldeki oyun kartlarını sırayla doğru konuma yerleştirmeye benzer: Yeni elemandan büyük olanlar sağa kaydırılır ve açılan yere yeni eleman konur.

Insertion Sort nasıl çalışır?

Insertion Sort, dizinin solunda giderek büyüyen sıralı bir bölüm oluşturarak çalışır. Başlangıçta ilk eleman tek başına sıralı kabul edilir; sağındaki elemanlar ise henüz işlenmemiştir.

Algoritma sıradaki elemanı anahtar değer olarak alır ve sıralı bölümdeki elemanlarla sağdan sola doğru karşılaştırır. Anahtardan büyük elemanlar birer konum sağa kaydırılır. Daha küçük veya eşit bir elemana ya da dizinin başına ulaşıldığında anahtar, açılan konuma yerleştirilir.

Örneğin elinde soldan sağa 3 ve 7 olarak sıralanmış iki kart olduğunu düşün. Yeni gelen 5 kartını yerleştirmek için 7'yi sağa kaydırıp 5'i 3 ile 7 arasına koyarsın. Böylece elindeki üç kart da sıralı olur.

Karşılaştırma ve adım adım çözüm kurma becerini farklı sorularla sınamak için Algoritmik Düşünme Testi ile pratik yapabilirsin.

Dizi adım adım nasıl sıralanır?

Dizi adım adım nasıl sıralanır?

[7, 3, 5, 1, 4] dizisinde önce 7 sıralı bölüm olarak kabul edilir, ardından diğer elemanlar sırayla bu bölüme yerleştirilir. Tablodaki sıralı ve sırasız bölümler, ilgili adım tamamlandıktan sonraki durumu gösterir.

Adım Key değeri Sıralı bölüm Sırasız bölüm Kaydırma ve yerleştirme Dizinin son durumu
Başlangıç Henüz seçilmedi [7] [3, 5, 1, 4] İlk eleman sıralı kabul edilir; kaydırma yapılmaz. [7, 3, 5, 1, 4]
1 3 [3, 7] [5, 1, 4] 7 sağa kaydırılır, 3 onun önüne yerleştirilir. [3, 7, 5, 1, 4]
2 5 [3, 5, 7] [1, 4] 7 sağa kaydırılır; 3 yerinde kalır ve 5 araya yerleştirilir. [3, 5, 7, 1, 4]
3 1 [1, 3, 5, 7] [4] 7, 5 ve 3 sağa kaydırılır; 1 başa yerleştirilir. [1, 3, 5, 7, 4]
4 4 [1, 3, 4, 5, 7] [] 7 ve 5 sağa kaydırılır; 3 ve 1 yerinde kalır, 4 araya yerleştirilir. [1, 3, 4, 5, 7]

Her adımın sonunda sıralı bölüm bir eleman genişler. Son eleman da yerleştirildiğinde işlenmemiş bölüm kalmaz ve dizinin tamamı küçükten büyüğe sıralanmış olur.

Python ile insertion sort nasıl yazılır?

Python'da insertion sort, her elemanı while döngüsüyle sıralı bölümdeki uygun yerine yerleştirerek uygulanabilir. Aşağıdaki fonksiyon, verilen listeyi yerinde değiştirir ve sıralanmış listeyi döndürür.

def insertion_sort(liste):
    for i in range(1, len(liste)):
        key = liste[i]
        j = i - 1

        while j >= 0 and liste[j] > key:
            liste[j + 1] = liste[j]
            j -= 1

        liste[j + 1] = key

    return liste


sayilar = [7, 3, 5, 1, 4]
print(insertion_sort(sayilar))

Beklenen çıktı:

[1, 3, 4, 5, 7]

for döngüsü, ilk eleman tek başına sıralı kabul edildiği için ikinci elemandan başlar. key = liste[i] satırı, yerleştirilecek değeri geçici olarak saklar. Böylece kaydırma sırasında listenin ilgili konumu değişse bile bu değer kaybolmaz.

j = i - 1, sıralı bölümün son elemanını gösterir. while koşulu, hem j indeksinin listenin başını geçmediğini hem de incelenen elemanın key değerinden büyük olduğunu kontrol eder.

Koşul sağlandıkça liste[j + 1] = liste[j] elemanı bir konum sağa kaydırır; j -= 1 ise karşılaştırmayı sola taşır. Döngü sona erdiğinde j + 1, saklanan değerin yerleştirileceği konumdur. Son olarak return liste aynı listeyi döndürür.

Döngüler ve liste işlemleri konusundaki bilgini gözden geçirmek için Python bilgi testini kullanabilirsin.

Zaman karmaşıklığı neden değişir?

Zaman karmaşıklığı neden değişir?

Insertion sort'un çalışma süresi, elemanların başlangıçtaki sırasına göre kaç karşılaştırma ve kaydırma gerektiğine bağlıdır. n listedeki eleman sayısını gösterdiğinde, en iyi durum doğrusal, ortalama ve en kötü durum ise karesel büyüme gösterir.

Durum Dizinin özelliği Kaydırma davranışı Zaman karmaşıklığı
En iyi Elemanlar zaten artan sıradadır. Kaydırma yapılmaz. O(n)
Ortalama Farklı eleman sıralamaları üzerinden değerlendirilir. Elemanlar gerektiği kadar sola taşınırken aradaki büyük elemanlar sağa kaydırılır. O(n²)
En kötü Elemanlar ters sıradadır. Her yeni eleman sıralı bölümün başına yerleştirilir. O(n²)

Liste zaten sıralıysa her yeni eleman önceki elemanla karşılaştırılır ve kaydırma gerektirmeden yerinde kalır. Ters sıralı bir listede ise her yeni eleman, önündeki sıralı bölümün tamamından küçük olduğu için bu bölümdeki elemanlar sağa kaydırılır.

Ortalama durum, farklı başlangıç sıralamaları üzerinden yapılan bir değerlendirmedir; tek bir liste için gereken kaydırma sayısı listenin içeriğine bağlıdır. Princeton Üniversitesi algoritma ve veri yapıları özetinde de insertion sort için en iyi durumda doğrusal, ortalama ve en kötü durumda karesel büyüme gösterilir.

Big O gösteriminin nasıl yorumlandığına ilişkin ayrıntılar için sitedeki Big O yazısına da bakabilirsin.

Kararlı sıralama ne anlama gelir?

Kararlı sıralama, sıralama anahtarı eşit olan kayıtların kendi aralarındaki başlangıç sırasının korunmasıdır. Örneğin öğrenci kayıtlarını nota göre sıralarken aynı nota sahip A öğrencisi başlangıçta B öğrencisinden önce geliyorsa, kararlı bir sıralamanın ardından da A, B sırası korunur.

Karşılaştırmanın not üzerinden yapıldığını düşünelim. Başlangıç sırası A (80), C (70), B (80) olan kayıtlar nota göre küçükten büyüğe sıralandığında C (70), A (80), B (80) olur. A ve B'nin notları eşit olduğundan, bu iki öğrencinin birbirine göre sırası değişmez.

Klasik insertion sort uygulamasında liste[j] > key koşulu kullanıldığında, yalnızca yerleştirilecek değerden büyük elemanlar sağa kaydırılır. Eşit değerler kaydırılmadığı için yeni eleman, kendisine eşit olan önceki elemanların arkasına yerleşir. Kayıtlarla çalışırken de aynı ilke, karşılaştırma ilgili anahtar değerleri üzerinden yapıldığında geçerlidir.

Insertion sort, neredeyse sıralı veriler için de pratik bir seçenek olabilir. Elemanlar doğru yerlerinde veya bu yerlere yakınsa, yerleştirme sırasında genellikle daha az kaydırma gerekir. Bunun uygulamadaki etkisi veri düzenine ve kullanılan yönteme bağlıdır.

Hangi uygulama hatalarına dikkat edilmeli?

Insertion sort yazarken sınır kontrolü, yerleştirilecek değerin saklanması ve kaydırma adımının doğru yürütülmesi önemlidir. Aşağıdaki hataları kontrol ederek uygulamanı gözden geçirebilirsin.

Sol sınır kontrolünü atlamak

Kaydırma döngüsünde j >= 0 koşulu bulunmazsa j, dizinin sol sınırının ötesine geçebilir. Python'da negatif indeksler listenin sonundan elemanlara eriştiği için bu durum hemen hata vermeden yanlış karşılaştırmalara da yol açabilir.

Koşulu j >= 0 and liste[j] > key sırasıyla yaz. Böylece Python, indeksin geçerli olduğunu kontrol ettikten sonra liste elemanını karşılaştırır.

Yerleştirilecek değeri saklamamak

Kaydırma işlemine başlamadan önce geçerli elemanı key değişkenine almazsan, üzerine başka bir değer yazıldığında onu kaybedebilirsin. Döngüye girmeden key = liste[i] atamasını yap ve uygun konumu bulduktan sonra bu değeri listeye yerleştir.

Selection sort ile karıştırmak

Insertion sort, sıradaki elemanı soldaki sıralı bölüme yerleştirirken gerekli elemanları kaydırır. Selection sort ise her adımda henüz sıralanmamış bölümden seçilecek elemanı arar ve onu uygun konuma taşır. Bu farkı bilmek, döngülerin hangi amaçla kurulduğunu anlamanı kolaylaştırır.

Uygulamayı kontrol et

  • Dış döngü, ikinci elemanı işlemek üzere 1 indeksinden başlıyor mu?
  • Yerleştirilecek eleman, kaydırma başlamadan önce key değişkenine alınıyor mu?
  • while koşulunda, listeye erişmeden önce j >= 0 kontrol ediliyor mu?
  • Her kaydırmanın ardından j bir azaltılıyor mu?
  • Kaydırma tamamlandığında key, j + 1 konumuna yerleştiriliyor mu?

Sık Sorulan Sorular

Insertion Sort hangi tür dizilerde daha iyi çalışır?

Insertion sort, özellikle küçük veya neredeyse sıralı dizilerde pratik bir seçenek olabilir. Elemanlar doğru konumlarına yakınsa yapılacak kaydırma sayısı azalabilir.

Insertion Sort neden kararlı bir sıralama algoritmasıdır?

Klasik insertion sort, yalnızca yerleştirilecek elemandan büyük olanları kaydırdığı için eşit anahtarlı elemanların birbirine göre sırasını korur. Karşılaştırma koşulunu değiştirmek bu özelliği etkileyebilir.

Insertion Sort ile Selection Sort arasındaki temel fark nedir?

Insertion sort, her yeni elemanı daha önce sıralanmış bölüme yerleştirir; selection sort ise sıralanmamış bölümden uygun elemanı seçerek yerine taşır.

Python'daki insertion_sort(liste) fonksiyonu özgün listeyi değiştirir mi?

Kaydırmaları doğrudan kendisine verilen liste üzerinde yapan insertion_sort(liste) uygulaması özgün listeyi değiştirir. Başlangıçtaki listeyi korumak istersen fonksiyona listenin bir kopyasını verebilirsin.

Kodu kontrol listesiyle karşılaştırıp farklı sıralardaki küçük diziler üzerinde denemek, her elemanın nasıl yerleştirildiğini takip etmene yardımcı olur.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara