
Terjemahan artikel ini disiapkan khusus untuk siswa dari kursus "Algoritma untuk Pengembang" .
Penyortiran piramida (atau penyortiran tumpukan, HeapSort) adalah metode penyortiran perbandingan berdasarkan pada struktur data seperti tumpukan biner. Ini mirip dengan pengurutan berdasarkan pilihan, di mana pertama-tama kita mencari elemen maksimum dan meletakkannya di akhir. Selanjutnya, kami ulangi operasi yang sama untuk elemen yang tersisa.
Pertama mari kita mendefinisikan pohon biner lengkap. Pohon biner jadi adalah pohon biner di mana setiap tingkat, dengan kemungkinan pengecualian yang terakhir, memiliki satu set simpul yang lengkap, dan semua daun terletak di sebelah kiri (Sumber Wikipedia ).
Biner heap adalah pohon biner lengkap di mana elemen disimpan dalam urutan khusus: nilai dalam node induk lebih besar dari (atau kurang dari) nilai-nilai dalam dua node anak. Opsi pertama disebut max-heap, dan yang kedua adalah min-heap. Tumpukan dapat diwakili oleh pohon biner atau array.
Mengapa representasi berbasis array digunakan untuk tumpukan biner?
Karena tumpukan biner adalah pohon biner yang lengkap, ia dapat dengan mudah direpresentasikan sebagai array, dan representasi berbasis array lebih efisien dalam hal konsumsi memori. Jika simpul induk disimpan dalam indeks I, anak kiri dapat dihitung sebagai 2 I + 1, dan anak kanan dapat dihitung sebagai 2 I + 2 (asalkan pengindeksan dimulai pada 0).
Algoritma penyortiran piramidal dalam urutan menaik:
- Bangun tumpukan maksimum dari input.
- Pada tahap ini, elemen terbesar disimpan di root heap. Ganti dengan elemen terakhir heap, dan kemudian kurangi ukurannya dengan 1. Akhirnya, ubah pohon yang dihasilkan menjadi max-heap dengan root baru.
- Ulangi langkah di atas sampai ukuran tumpukan lebih besar dari 1.
Bagaimana cara membangun banyak?
Prosedur konversi heap (selanjutnya disebut sebagai prosedur heapify) dapat diterapkan ke node hanya jika node anaknya sudah dikonversi. Dengan demikian, konversi harus dilakukan dari bawah ke atas. Mari kita cari tahu dengan sebuah contoh:
: 4, 10, 3, 5, 1 4(0) / \ 10(1) 3(2) / \ 5(3) 1(4) . heapify 1: 4(0) / \ 10(1) 3(2) / \ 5(3) 1(4) heapify 0: 10(0) / \ 5(1) 3(2) / \ 4(3) 1(4) heapify .
Rekomendasi: Silakan selesaikan masalah pada "PRAKTEK" terlebih dahulu sebelum melanjutkan dengan solusi .
C ++
// C++ #include <iostream> using namespace std; // i, // arr[]. n - void heapify(int arr[], int n, int i) { int largest = i; // int l = 2*i + 1; // = 2*i + 1 int r = 2*i + 2; // = 2*i + 2 // if (l < n && arr[l] > arr[largest]) largest = l; // , if (r < n && arr[r] > arr[largest]) largest = r; // if (largest != i) { swap(arr[i], arr[largest]); // heapify(arr, n, largest); } } // , void heapSort(int arr[], int n) { // ( ) for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // for (int i=n-1; i>=0; i--) { // swap(arr[0], arr[i]); // heapify heapify(arr, i, 0); } } /* n*/ void printArray(int arr[], int n) { for (int i=0; i<n; ++i) cout << arr[i] << " "; cout << "\n"; } // int main() { int arr[] = {12, 11, 13, 5, 6, 7}; int n = sizeof(arr)/sizeof(arr[0]); heapSort(arr, n); cout << "Sorted array is \n"; printArray(arr, n); }
Jawa
// Java public class HeapSort { public void sort(int arr[]) { int n = arr.length; // ( ) for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // for (int i=n-1; i>=0; i--) { // int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // heapify heapify(arr, i, 0); } } // i, // arr[]. n - void heapify(int arr[], int n, int i) { int largest = i; // int l = 2*i + 1; // = 2*i + 1 int r = 2*i + 2; // = 2*i + 2 // if (l < n && arr[l] > arr[largest]) largest = l; // , if (r < n && arr[r] > arr[largest]) largest = r; // if (largest != i) { int swap = arr[i]; arr[i] = arr[largest]; arr[largest] = swap; // heapify(arr, n, largest); } } /* n */ static void printArray(int arr[]) { int n = arr.length; for (int i=0; i<n; ++i) System.out.print(arr[i]+" "); System.out.println(); } // public static void main(String args[]) { int arr[] = {12, 11, 13, 5, 6, 7}; int n = arr.length; HeapSort ob = new HeapSort(); ob.sort(arr); System.out.println("Sorted array is"); printArray(arr); } }
Python
# Python # i, arr[]. n - def heapify(arr, n, i): largest = i # Initialize largest as root l = 2 * i + 1 # left = 2*i + 1 r = 2 * i + 2 # right = 2*i + 2 # , if l < n and arr[i] < arr[l]: largest = l # , if r < n and arr[largest] < arr[r]: largest = r # , if largest != i: arr[i],arr[largest] = arr[largest],arr[i] # # heapify . heapify(arr, n, largest) # def heapSort(arr): n = len(arr) # max-heap. for i in range(n, -1, -1): heapify(arr, n, i) # for i in range(n-1, 0, -1): arr[i], arr[0] = arr[0], arr[i] # heapify(arr, i, 0) # arr = [ 12, 11, 13, 5, 6, 7] heapSort(arr) n = len(arr) print ("Sorted array is") for i in range(n): print ("%d" %arr[i]), # Mohit Kumra
C tajam
// C# using System; public class HeapSort { public void sort(int[] arr) { int n = arr.Length; // ( ) for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // for (int i=n-1; i>=0; i--) { // int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // heapify heapify(arr, i, 0); } } // i, // arr[]. n - void heapify(int[] arr, int n, int i) { int largest = i; // int l = 2*i + 1; // left = 2*i + 1 int r = 2*i + 2; // right = 2*i + 2 // if (l < n && arr[l] > arr[largest]) largest = l; // , if (r < n && arr[r] > arr[largest]) largest = r; // if (largest != i) { int swap = arr[i]; arr[i] = arr[largest]; arr[largest] = swap; // heapify(arr, n, largest); } } /* n */ static void printArray(int[] arr) { int n = arr.Length; for (int i=0; i<n; ++i) Console.Write(arr[i]+" "); Console.Read(); } // public static void Main() { int[] arr = {12, 11, 13, 5, 6, 7}; int n = arr.Length; HeapSort ob = new HeapSort(); ob.sort(arr); Console.WriteLine("Sorted array is"); printArray(arr); } } // // Akanksha Ra (Abby_akku)
Php
<?php // Php // i, // arr[]. n - function heapify(&$arr, $n, $i) { $largest = $i; // $l = 2*$i + 1; // = 2*i + 1 $r = 2*$i + 2; // = 2*i + 2 // if ($l < $n && $arr[$l] > $arr[$largest]) $largest = $l; // , if ($r < $n && $arr[$r] > $arr[$largest]) $largest = $r; // if ($largest != $i) { $swap = $arr[$i]; $arr[$i] = $arr[$largest]; $arr[$largest] = $swap; // heapify($arr, $n, $largest); } } // , function heapSort(&$arr, $n) { // ( ) for ($i = $n / 2 - 1; $i >= 0; $i--) heapify($arr, $n, $i); // for ($i = $n-1; $i >= 0; $i--) { // $temp = $arr[0]; $arr[0] = $arr[$i]; $arr[$i] = $temp; // heapify heapify($arr, $i, 0); } } /* n */ function printArray(&$arr, $n) { for ($i = 0; $i < $n; ++$i) echo ($arr[$i]." ") ; } // $arr = array(12, 11, 13, 5, 6, 7); $n = sizeof($arr)/sizeof($arr[0]); heapSort($arr, $n); echo 'Sorted array is ' . "\n"; printArray($arr , $n); // Shivi_Aggarwal ?>
Kesimpulan:
: 5 6 7 11 12 13
Berikut adalah kode C sebelumnya untuk referensi.
Komentar:
Penyortiran piramidal adalah algoritma yang sangat cocok. Implementasinya yang khas tidak stabil, tetapi dapat dilakukan seperti itu (lihat di sini ).
Kompleksitas waktu: Kompleksitas waktu heapify adalah O (Logn). Kompleksitas waktu createAndBuildHeap () adalah O (n), dan runtime total dari jenis piramida adalah O (nLogn).
Aplikasi Sortir Piramida:
- Mengurutkan array yang hampir diurutkan (atau diurutkan berdasarkan posisi K) ;
- k elemen (atau terkecil) terbesar dalam array .
Algoritma penyortiran piramidal memiliki penggunaan yang terbatas, karena Quicksort dan Mergesort lebih baik dalam praktiknya. Namun, struktur tumpukan data itu sendiri cukup sering digunakan. Lihat Menumpuk Aplikasi Struktur Data
Tangkapan layar:

- (Sekarang kita telah membangun heap, kita perlu mengubahnya menjadi max-heap)

- (Dalam max-heap, node induk selalu lebih besar atau sama dengan node anak
10 lebih dari 4. Oleh karena itu, kami menukar 4 dan 10)
- (Dalam max-heap, node induk selalu lebih besar atau sama dengan node anak
5 lebih 4. Oleh karena itu, kami bertukar tempat 5 dan 4)

- (Tukar node pertama dan terakhir dan hapus yang terakhir dari heap)
Tes piramida
Algoritma pengurutan lainnya pada GeeksforGeeks / GeeksQuiz:
Sortir Cepat , Sortir menurut pilihan , Sortir Gelembung , Masukkan Sortir , Sortir Gabungan , Sortir Piramida , Sortir Bit , Sortir Blok , Sortir Blok , Sortir Shell , Sortir Sisir, Hitut Urutkan dengan Daftar .
Workshop penyortiran
Silakan tinggalkan komentar jika Anda menemukan sesuatu yang salah atau Anda ingin berbagi informasi tambahan tentang topik yang dibahas di atas.