11 - Sıralama Algoritmaları
2026
Sıralama algoritması, bir dizinin veya listenin elemanlarını belirli bir ölçüte göre yeniden düzenlemek için kullanılır.
Örnekte sayılar küçükten büyüğe sıralanmıştır.
Aynı işi yapan birçok sıralama algoritması vardır; ancak bu algoritmaların çalışma biçimleri ve maliyetleri farklıdır.
Bazı algoritmalar:
| Ölçüt | Anlamı |
|---|---|
| Karşılaştırma sayısı | Elemanların birbirleriyle kaç kez karşılaştırıldığı |
| Yer değiştirme sayısı | Elemanların dizide kaç kez yer değiştirdiği |
| En iyi durum | Algoritmanın en avantajlı girişteki çalışma maliyeti |
| Ortalama durum | Genel kullanımda beklenen çalışma maliyeti |
| En kötü durum | Algoritmanın en zor girişteki çalışma maliyeti |
| Ek bellek kullanımı | Algoritmanın dizi dışında ne kadar ek alan kullandığı |
| Kararlılık | Eşit değerli elemanların kendi aralarındaki sırayı koruyup korumadığı |
Bir sıralama algoritması, eşit anahtara sahip elemanların başlangıçtaki göreli sırasını koruyorsa kararlı kabul edilir.
Örneğin öğrencileri nota göre sıraladığımızı düşünelim:
Nota göre küçükten büyüğe sıralama yapıldığında Ali ve Veli’nin ikisi de 80 aldığı için kendi aralarındaki sıra korunuyorsa algoritma kararlıdır.
İlk üç algoritma daha çok sıralama mantığını anlamak için kullanılır:
Bu algoritmaların ortak özelliği, çoğu durumda O(n²) çalışma maliyetine sahip olmalarıdır.
Bu nedenle büyük diziler için genellikle tercih edilmezler; ancak algoritma mantığını öğrenmek için oldukça uygundurlar.
Seçerek sıralama, her dış döngü turunda dizinin sıralanmamış bölümündeki en küçük elemanı bulur ve bu elemanı sıralanmamış bölümün başına taşır.
Temel fikir:
Dizi iki bölüm gibi düşünülür:
Başlangıçta sıralı bölüm boştur.
Her dış döngü turunda:
İlk eleman geçici olarak en küçük eleman kabul edilir.
En küçük kabul edilen eleman, dizinin geri kalan elemanlarıyla karşılaştırılır.
Daha küçük bir eleman bulunursa, en küçük elemanın konumu güncellenir.
Sıralanmamış bölümdeki en küçük eleman bulunduğunda, bu eleman sıralanmamış bölümün başındaki elemanla yer değiştirir.
Her dış döngü turundan sonra dizinin başındaki sıralı bölüm bir eleman büyür.
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}Tam kod:
https://gist.github.com/ecylmz/68f7646b1805c623db1b553867ef8585#file-selection-sort-c
| Özellik | Değer |
|---|---|
| En iyi durum | O(n²) |
| Ortalama durum | O(n²) |
| En kötü durum | O(n²) |
| Ek bellek | O(1) |
| Kararlı mı? | Yer değiştirmeli temel sürüm genellikle kararlı değildir |
Selection Sort’un avantajı basit olmasıdır.
Dezavantajı ise dizi zaten sıralı olsa bile çok sayıda karşılaştırma yapmasıdır.
35, 40, 25, 10, 45 dizisi Selection Sort ile küçükten büyüğe sıralanıyor.
Dizi kaçıncı dış döngü turunun sonunda tamamen sıralı hale gelir?
Başlangıç:
Doğru cevap: C) 3
Baloncuk sıralama, komşu elemanları karşılaştırarak yanlış sırada olanları yer değiştirir.
Her dış döngü turunda büyük elemanlar dizinin sonuna doğru ilerler.
Bu nedenle algoritmanın adı “baloncuk” benzetmesiyle açıklanır: büyük elemanlar her turda sona doğru taşınır.
Artan sıralama için:
Yan yana duran iki elemanı karşılaştır.
Soldaki eleman sağdakinden büyükse yer değiştir.
Dizinin sonuna kadar devam et.Her tur sonunda sıralanmamış bölümdeki en büyük eleman kendi yerine yerleşir.

Aynı işlem kalan elemanlar için tekrar edilir.
Her turdan sonra en büyük eleman sıralanmamış bölümün sonuna yerleşir.

Her turda dizinin tamamını tekrar kontrol etmek gerekmez.
Çünkü önceki turda en büyük eleman zaten sona yerleşmiştir.
Sıralanmamış tüm elemanlar doğru konumlarına yerleştiğinde dizi sıralanmış olur.
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}Tam kod:
https://gist.github.com/ecylmz/68f7646b1805c623db1b553867ef8585#file-bubble-sort-c
Dizi bir tur boyunca hiç değişmediyse zaten sıralıdır.
Bu durumda algoritma erken durdurulabilir.
| Özellik | Değer |
|---|---|
| En iyi durum | Erken durma varsa O(n), yoksa O(n²) |
| Ortalama durum | O(n²) |
| En kötü durum | O(n²) |
| Ek bellek | O(1) |
| Kararlı mı? | Evet |
Bubble Sort anlaşılması kolaydır; ancak büyük diziler için verimli değildir.
Ekleme sıralaması, sıralanmamış bir elemanı her turda alıp sıralı bölümdeki uygun konuma yerleştirir.
Kartları elde sıralama örneğine benzer:
Dizi iki bölüm gibi düşünülür:
Başlangıçta ilk eleman tek başına sıralı kabul edilir.
Her turda sıralanmamış bölümden bir eleman alınır ve soldaki sıralı bölümde doğru yere yerleştirilir.
Burada bir tur, sıralanmamış bölümden bir elemanın alınıp sıralı bölüme yerleştirilmesi anlamına gelir.
Aşağıdaki diziyi sıralamamız gerektiğini düşünelim.
İkinci eleman alınır ve geçici olarak key değişkeninde saklanır.
key, solundaki sıralı bölümde uygun konuma yerleştirilir.
İlk iki eleman artık sıralı kabul edilir.
Üçüncü eleman alınır ve solundaki elemanlarla karşılaştırılarak uygun konuma yerleştirilir.
Her turda bir eleman sıralı bölüme eklenir.
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}Tam kod:
https://gist.github.com/ecylmz/68f7646b1805c623db1b553867ef8585#file-insertion-sort-c
| Özellik | Değer |
|---|---|
| En iyi durum | O(n) |
| Ortalama durum | O(n²) |
| En kötü durum | O(n²) |
| Ek bellek | O(1) |
| Kararlı mı? | Evet |
Insertion Sort özellikle küçük dizilerde ve neredeyse sıralı verilerde iyi sonuç verebilir.
| Algoritma | Temel fikir | En iyi | Ortalama | En kötü | Kararlı mı? |
|---|---|---|---|---|---|
| Selection Sort | En küçüğü seç | O(n²) |
O(n²) |
O(n²) |
Genelde hayır |
| Bubble Sort | Komşuları değiştir | O(n)* |
O(n²) |
O(n²) |
Evet |
| Insertion Sort | Uygun yere ekle | O(n) |
O(n²) |
O(n²) |
Evet |
* Bubble Sort için O(n) en iyi durum, erken durma kontrolü kullanılan sürüm için geçerlidir.
Bazı algoritmalar problemi daha küçük parçalara ayırarak çözer.
Genel yapı:
Quick Sort ve Merge Sort bu yaklaşıma dayanır; ancak bölme ve sonuç üretme biçimleri farklıdır.
| Algoritma | Bölme biçimi | Sonuç üretme biçimi |
|---|---|---|
| Quick Sort | Pivot seçerek küçük ve büyükleri ayırır | Pivot doğru konuma yerleşir; alt diziler ayrıca sıralanır |
| Merge Sort | Diziyi ortadan ikiye böler | Sıralı alt dizileri birleştirir |
Quick Sort’ta asıl iş bölme sırasında yapılır.
Merge Sort’ta asıl iş birleştirme sırasında yapılır.
Quick Sort, bir pivot eleman seçerek diziyi iki bölüme ayırır:
Daha sonra aynı işlem sol ve sağ alt diziler için tekrarlanır.
Pivot farklı şekillerde seçilebilir:
Bu sunumda pivot olarak dizinin en sağındaki eleman seçilecektir.
Partition işlemi, diziyi pivot etrafında yeniden düzenler.
Amaç:
Bu sunumda, pivotun en sağdaki eleman seçildiği yaygın partition yaklaşımı kullanılacaktır.
İki önemli indeks vardır:
| İndeks | Görevi |
|---|---|
j |
Diziyi soldan sağa tarar |
i |
Pivottan küçük/eşit elemanların bittiği sınırı gösterir |
arr[j] <= pivot olduğunda i bir artırılır ve arr[i] ile arr[j] yer değiştirir.
Pivot sabit tutulur.
Dizi soldan sağa taranır ve elemanlar pivot ile karşılaştırılır.
Pivot değerinden büyük bir eleman bulunduğunda bu eleman şimdilik yerinde kalır.
Amaç, daha sonra bulunacak küçük bir elemanla yer değiştirebilmektir.
Pivot değerinden küçük veya eşit bir eleman bulunduğunda bu eleman sol bölüme alınır.
Tarama işlemi pivotun bir önceki elemanına kadar devam eder.
Tarama bitince pivot, küçük/eşit elemanların hemen sağına yerleştirilir.
Böylece pivot kendi doğru konumuna geçmiş olur.
Pivot doğru konuma yerleştirildikten sonra aynı işlem sol ve sağ alt diziler için tekrarlanır.
Alt diziler tek elemanlı veya boş hale geldiğinde işlem durur.
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pivotIndex = partition(arr, low, high);
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
}Tam kod:
https://gist.github.com/ecylmz/68f7646b1805c623db1b553867ef8585#file-quick-sort-c
| Özellik | Değer |
|---|---|
| En iyi durum | O(n log n) |
| Ortalama durum | O(n log n) |
| En kötü durum | O(n²) |
| Ek bellek | Ortalama O(log n), en kötü O(n) |
| Kararlı mı? | Genelde hayır |
Quick Sort çoğu pratik durumda hızlıdır; ancak kötü pivot seçimleri performansı düşürebilir.
Merge Sort da böl ve yönet yaklaşımını kullanır.
Temel fikir:
Merge Sort’ta bölme işlemi kolaydır; asıl iş sıralı birleştirme aşamasındadır.
Dizi sürekli ikiye bölünür.
Bölme işlemi, her parça tek elemanlı hale gelene kadar devam eder.
Tek elemanlı diziler zaten sıralı kabul edilir.
Sıralanmak istenen dizi:
Önce bölme adımları uygulanır.
Sonra küçük sıralı parçalar birleştirilerek daha büyük sıralı parçalar oluşturulur.
Bu noktada parçalar tek elemanlı hale gelmiştir.
Tek elemanlı parçalar sıralı kabul edilir.
Birleştirme sırasında her adımda küçük eleman önce alınır.
İki sıralı dizi düşünelim:
Her adımda iki dizinin başındaki elemanlar karşılaştırılır.
Küçük olan eleman sonuç dizisine eklenir.
Bu işlem iki alt dizi tamamen bitene kadar devam eder.
while (i < leftSize && j < rightSize) {
if (left[i] <= right[j]) {
arr[k] = left[i];
i++;
} else {
arr[k] = right[j];
j++;
}
k++;
}left[i] <= right[j] kullanımı, eşit elemanlarda soldaki elemanı önce aldığı için kararlılığı korur.
Bir alt dizi erken biterse diğer alt dizide kalan elemanlar sonuç dizisine eklenir.
while (i < leftSize) {
arr[k] = left[i];
i++;
k++;
}
while (j < rightSize) {
arr[k] = right[j];
j++;
k++;
}Tam kod:
https://gist.github.com/ecylmz/68f7646b1805c623db1b553867ef8585#file-merge-sort-c
| Özellik | Değer |
|---|---|
| En iyi durum | O(n log n) |
| Ortalama durum | O(n log n) |
| En kötü durum | O(n log n) |
| Ek bellek | O(n) |
| Kararlı mı? | Evet |
Merge Sort’un çalışma süresi dengelidir; ancak ek dizi kullandığı için bellek maliyeti Quick Sort’a göre daha yüksektir.
| Algoritma | En iyi | Ortalama | En kötü | Ek bellek | Kararlı mı? |
|---|---|---|---|---|---|
| Selection Sort | O(n²) |
O(n²) |
O(n²) |
O(1) |
Genelde hayır |
| Bubble Sort | O(n)* |
O(n²) |
O(n²) |
O(1) |
Evet |
| Insertion Sort | O(n) |
O(n²) |
O(n²) |
O(1) |
Evet |
| Quick Sort | O(n log n) |
O(n log n) |
O(n²) |
Ort. O(log n), kötü O(n) |
Genelde hayır |
| Merge Sort | O(n log n) |
O(n log n) |
O(n log n) |
O(n) |
Evet |
* Bubble Sort için O(n) en iyi durum, erken durma kontrolü kullanılan sürüm için geçerlidir.
| Durum | Uygun Yaklaşım |
|---|---|
| Algoritma mantığını yeni öğreniyorsak | Selection, Bubble, Insertion |
| Dizi küçükse | Insertion Sort yeterli olabilir |
| Dizi neredeyse sıralıysa | Insertion Sort veya erken durmalı Bubble Sort |
| Genel kullanımda hızlı bir algoritma istiyorsak | Quick Sort |
| En kötü durumda da dengeli süre istiyorsak | Merge Sort |
| Kararlı sıralama gerekiyorsa | Insertion Sort, Bubble Sort, Merge Sort |
| Ek bellek az kullanılmalıysa | Selection, Bubble, Insertion; çoğu pratik durumda Quick Sort |
İlk üç eleman sıralı bölüm haline gelmiştir.
O(n log n) davranış gösteren algoritmalar tercih edilir.