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.

Heap Sort - JavaScript
1/**
2 * Heap Sort implementation for JavaScript arrays
3 * @param {Array} arr - The array to sort
4 * @returns {Array} - A new sorted array
5 */
6function heapSort(arr) {
7 // Create a copy to avoid modifying the original array
8 const result = [...arr];
9 const n = result.length;
10
11 // Build max heap
12 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 one
17 for (let i = n - 1; i > 0; i--) {
18 // Move current root to end
19 [result[0], result[i]] = [result[i], result[0]];
20
21 // Call heapify on the reduced heap
22 heapify(result, i, 0);
23 }
24
25 return result;
26}
27
28/**
29 * Function to heapify a subtree rooted at index i
30 * @param {Array} arr - The array to heapify
31 * @param {Number} n - Size of the heap
32 * @param {Number} i - Root index of the subtree to heapify
33 */
34function heapify(arr, n, i) {
35 let largest = i; // Initialize largest as root
36 const left = 2 * i + 1; // Left child
37 const right = 2 * i + 2; // Right child
38
39 // If left child is larger than root
40 if (left < n && arr[left] > arr[largest]) {
41 largest = left;
42 }
43
44 // If right child is larger than largest so far
45 if (right < n && arr[right] > arr[largest]) {
46 largest = right;
47 }
48
49 // If largest is not root
50 if (largest !== i) {
51 // Swap and continue heapifying
52 [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.

Sıralanmış Dizi: null

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ı:

ÖzellikHeap SortQuick SortMerge Sort
En İyi DurumO(n log n)O(n log n)O(n log n)
En Kötü DurumO(n log n)O(n²)O(n log n)
Alan KarmaşıklığıO(1)O(log n)O(n)
KararlılıkKararsızKararsızKararlı
UyarlanabilirlikUyarlanabilir değilKısmen uyarlanabilirUyarlanabilir değil
Önbellek VerimliliğiDüşükYüksekOrta
Tercih Edilme DurumuTutarlı performans ve sınırlı bellekGenel amaçlı, pratik verimlilikKararlı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