Heap Sort Algoritması
Heap Sort Açıklaması
Heap Sort, binary heap veri yapısını kullanan karşılaştırma tabanlı bir sıralama algoritmasıdır. Bu algoritma, veriyi önce max-heap (veya min-heap) yapısına dönüştürür, ardından bu yapıyı kullanarak sıralama işlemini gerçekleştirir. ## Çalışma Prensibi: 1. Diziyi bir max-heap yapısına dönüştür (heapify). 2. Kök düğümü (en büyük eleman) dizinin sonuyla takas et. 3. Heap boyutunu bir azalt ve dizinin geri kalanı için heapify işlemini tekrarla. 4. Tüm dizi sıralanana kadar 2. ve 3. adımları tekrarla. ## Önemli Özellikler: 1. **Yerinde Sıralama**: Ek bellek kullanmadan orijinal diziyi sıralar. 2. **Kararsız Sıralama**: Eşit değere sahip elemanların orijinal sırası korunmayabilir. 3. **Zaman Karmaşıklığı**: Her durumda O(n log n) zaman karmaşıklığına sahiptir. 4. **Heapify İşlemi**: O(log n) karmaşıklığında bir işlemdir, heap oluşturma ise O(n) zamanda gerçekleşir. Heap Sort, merge sort gibi her zaman O(n log n) performansına sahip, ancak quick sort'un aksine en kötü durum senaryolarında bile tutarlı performans gösterir.
Kod Örnekleri
Heap Sort algoritmasının farklı programlama dillerindeki uygulamaları aşağıda verilmiştir. Her örnek, algoritmanın optimize edilmiş versiyonunu içerir ve detaylı açıklamalarla sunulmuştur.
1/**2 * Heap Sort implementation for JavaScript arrays3 * @param {Array} arr - The array to sort4 * @returns {Array} - A new sorted array5 */6function heapSort(arr) {7 // Create a copy to avoid modifying the original array8 const result = [...arr];9 const n = result.length;10 11 // Build max heap12 for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {13 heapify(result, n, i);14 }15 16 // Extract elements from heap one by one17 for (let i = n - 1; i > 0; i--) {18 // Move current root to end19 [result[0], result[i]] = [result[i], result[0]];20 21 // Call heapify on the reduced heap22 heapify(result, i, 0);23 }24 25 return result;26}2728/**29 * Function to heapify a subtree rooted at index i30 * @param {Array} arr - The array to heapify31 * @param {Number} n - Size of the heap32 * @param {Number} i - Root index of the subtree to heapify33 */34function heapify(arr, n, i) {35 let largest = i; // Initialize largest as root36 const left = 2 * i + 1; // Left child37 const right = 2 * i + 2; // Right child38 39 // If left child is larger than root40 if (left < n && arr[left] > arr[largest]) {41 largest = left;42 }43 44 // If right child is larger than largest so far45 if (right < n && arr[right] > arr[largest]) {46 largest = right;47 }48 49 // If largest is not root50 if (largest !== i) {51 // Swap and continue heapifying52 [arr[i], arr[largest]] = [arr[largest], arr[i]];53 heapify(arr, n, largest);54 }55}
Kendi Verilerinizle Test Edin
Aşağıya kendi verilerinizi girerek Heap Sort algoritmasını test edebilirsiniz. Virgülle ayrılmış sayılar girin (örn: 5,3,8,4,2) veya rastgele bir dizi oluşturun.
Heap Sort Demo
Verdiğiniz dizi Heap Sort algoritması ile sıralanacaktır.
Not: Heap Sort her durumda O(n log n) zaman karmaşıklığına sahiptir ve büyük veri setleri için tutarlı performans gösterir.
Algoritma Analizi
Zaman ve Alan Karmaşıklığı
Zaman Karmaşıklığı
- En İyi Durum:
O(n log n)
- Heap oluşturma O(n), çıkarma işlemleri O(n log n). - Ortalama Durum:
O(n log n)
- Her durumda aynı sayıda karşılaştırma ve takas yapılır. - En Kötü Durum:
O(n log n)
- Dizinin durumundan bağımsız, her zaman aynı karmaşıklık.
Alan Karmaşıklığı
O(1)
- Heap Sort yerinde (in-place) bir sıralama algoritmasıdır. Giriş dizisinin boyutundan bağımsız olarak sabit miktarda ekstra bellek kullanır.
Kararlılık (Stability)
Heap Sort kararsız bir algoritmadır. Eşit değere sahip elemanların göreceli sırası korunmayabilir. Bunun nedeni, uzak mesafedeki takas işlemlerinin orijinal sırayı bozabilmesidir.
Avantajlar ve Dezavantajlar
Avantajlar
- Her durumda O(n log n) karmaşıklık garantisi sağlar.
- Ekstra bellek alanı gerektirmez (O(1) alan karmaşıklığı).
- Quick Sort'un aksine, en kötü durumda bile verimlidir.
- Öncelikli kuyruk (priority queue) uygulamaları için uygundur.
- Kısmen sıralanmış veri setlerinde de tutarlı performans gösterir.
Dezavantajlar
- Kararsız bir algoritma olduğundan, eşit değerli elemanların sırası değişebilir.
- Pratik uygulamalarda genellikle Quick Sort'tan daha yavaştır.
- Önbellek dostu değildir (cache-unfriendly), çünkü uzak bellek konumlarına erişimi gerektirir.
- Karmaşık veri yapılarını sıralamak için ek adımlar gerektirebilir.
Heap Sort ve Diğer Algoritmalar
Heap Sort ile diğer popüler sıralama algoritmalarının karşılaştırması:
Özellik | Heap Sort | Quick Sort | Merge Sort |
---|---|---|---|
En İyi Durum | O(n log n) | O(n log n) | O(n log n) |
En Kötü Durum | O(n log n) | O(n²) | O(n log n) |
Alan Karmaşıklığı | O(1) | O(log n) | O(n) |
Kararlılık | Kararsız | Kararsız | Kararlı |
Uyarlanabilirlik | Uyarlanabilir değil | Kısmen uyarlanabilir | Uyarlanabilir değil |
Önbellek Verimliliği | Düşük | Yüksek | Orta |
Tercih Edilme Durumu | Tutarlı performans ve sınırlı bellek | Genel amaçlı, pratik verimlilik | Kararlılık ve güvenilirlik |
Heap Sort her durumda O(n log n) karmaşıklık garantisi sağlar, bu da onu en kötü durumların önemli olduğu senaryolarda güvenilir bir seçim yapar. Ancak pratik uygulamalarda, önbellek verimliliği nedeniyle genellikle Quick Sort daha iyi performans gösterir.
İlgili Algoritmalar
Heap Sort ile ilişkili veya benzer algoritmaları keşfedin:
Priority Queue
Heap veri yapısını kullanarak elemanları öncelik sırasına göre işler. Heap Sort'un temelini oluşturur.
Smoothsort
Heap Sort'un bir varyasyonu olup, Leonardo heapleri kullanır ve kısmen sıralı dizilerde daha iyi performans gösterir.
Introspective Sort
Quick Sort, Heap Sort ve Insertion Sort'u birleştiren hibrit bir algoritma. En iyi durumda Quick Sort, en kötü durumda Heap Sort kullanır.
Heap Sort
Binary heap veri yapısını kullanan, karşılaştırma tabanlı bir sıralama algoritması.
Avantajlar
- Her durumda O(n log n) zaman karmaşıklığı garantisi
- Ekstra bellek gerektirmez (yerinde sıralama)
- En kötü durumda bile tutarlı performans
- Öncelikli kuyruk (priority queue) uygulamaları için idealdir
Dezavantajlar
- Kararsız bir sıralama algoritmasıdır
- Pratik uygulamalarda genellikle Quick Sort'tan daha yavaştır
- Önbellek dostu değildir (cache-unfriendly)
- Veri erişim modelinden dolayı modern CPU mimarilerinde verimsiz olabilir