Eklemeli Sıralama
Her elemanı soldaki sıralı kısımda doğru yere sokan sıralama algoritması.
#Nasıl çalışır?
Eklemeli sıralama (insertion sort), elindeki iskambil kâğıtlarını sıraya dizmeye benzer: her yeni kartı, zaten sıralı olan kartların arasında doğru yere sokarsın.
Dizinin sol kısmı her zaman kendi içinde sıralıdır. Sıradaki eleman (key) alınır; solundaki kendisinden büyük elemanlar birer sağa kaydırılır ve key açılan boşluğa yerleştirilir.
Dizi neredeyse sıralıysa çok az kaydırma gerekir. Bu yüzden insertion sort pratikte küçük ve neredeyse sıralı dizilerde çok hızlıdır.
#Canlı animasyon
Soldaki kısım her zaman sıralı tutulur; sıradaki eleman bu kısımda doğru yere sokulur.
for i = 1 to n - 1key = a[i]; j = i - 1while j >= 0 and a[j] > keya[j + 1] = a[j]; j = j - 1a[j + 1] = key
#Adım adım
- 01İkinci elemandan başla; ilk eleman tek başına sıralı bir kısımdır.
- 02Sıradaki elemanı (key) al.
- 03Solundaki sıralı kısımda key'den büyük olan elemanları birer sağa kaydır.
- 04Kendisinden küçük ya da eşit bir elemana veya dizinin başına gelince key'i boşluğa yerleştir.
- 05Bir sonraki elemanla devam et; son eleman da yerleşince dizi sıralanmıştır.
#Örnek kod
Aynı algoritma 8 dilde. Her program derlenip çalıştırılarak test edildi ve hepsi aynı çıktıyı veriyor.
def insertion_sort(a: list[int]) -> None:
for i in range(1, len(a)):
key = a[i]
j = i - 1
# Shift larger elements of the sorted part one place right.
while j >= 0 and a[j] > key:
a[j + 1] = a[j]
j -= 1
a[j + 1] = key
numbers = [5, 1, 4, 2, 8, 3]
insertion_sort(numbers)
print(*numbers)#Karmaşıklık
| En iyi | O(n) |
|---|---|
| Ortalama | O(n²) |
| En kötü | O(n²) |
| Ek bellek | O(1) |
| Kararlı mı? | Evet |
| Yerinde mi? | Evet |
Dizi zaten sıralıysa her eleman tek karşılaştırmayla yerinde kalır: toplam n-1 karşılaştırma, yani O(n). Ters sıralı dizide her eleman en başa kadar kaydırılır ve yaklaşık n²/2 işlem gerekir. Eşit elemanları birbirinin önüne geçirmediği için kararlıdır.
#Ne zaman kullanılır?
Küçük dizilerde (birkaç düzine elemana kadar) ve neredeyse sıralı verilerde en iyi seçeneklerden biridir. Bu yüzden Timsort gibi gerçek dünyadaki hibrit algoritmalar küçük parçaları insertion sort ile sıralar. Veri parça parça geldiğinde (online) de kullanışlıdır.
#Alıştırma
Soruları cevaplamak ve ilerlemeni kaydetmek için giriş yap.
Kolay
Insertion sort'ta dizinin sol kısmı için hangisi her zaman doğrudur?
- 1Kendi içinde sıralıdır
- 2En küçük elemanları içerir
- 3Boştur
- 4Pivottan küçük elemanları içerir
Insertion sort zaten sıralı bir dizide hangi karmaşıklıkta çalışır?
- 1O(n)
- 2O(n²)
- 3O(n log n)
- 4O(1)
Insertion sort kararlı (stable) bir algoritma mıdır?
- 1Evet
- 2Hayır
Orta
[3, 7, 9, 5] dizisinde 5 yerleştirildikten sonra dizi nasıl görünür?
- 1[3, 5, 7, 9]
- 2[3, 7, 5, 9]
- 3[5, 3, 7, 9]
- 4[3, 5, 9, 7]
Zor
Timsort gibi hibrit algoritmalar küçük parçaları neden insertion sort ile sıralar?
- 1Küçük ve neredeyse sıralı verilerde ek yükü çok az olduğu için
- 2En kötü durumda O(n log n) olduğu için
- 3Kararsız olduğu için
- 4Ek bellek gerektirdiği için
#Bundan sonra
Bu dersi bildiğini varsayan dersler: