Sortowanie sterty to technika sortowania oparta na porównaniach, w której najpierw budujemy Max Heap, a następnie zamieniamy element główny z ostatnim elementem (wielkość razy) i za każdym razem zachowujemy właściwość sterty, aby ostatecznie ją posortować.
Przykłady:
Input : 10 20 15 17 9 21 Output : 9 10 15 17 20 21 Input: 12 11 13 5 6 7 15 5 19 Output: 5 5 6 7 11 12 13 15 19
W pierwszym przykładzie najpierw musimy zbudować Max Heap.
Zaczniemy więc od 20. roku życia jako dziecko i sprawdzimy, czy istnieje jego rodzic. Tutaj 10 jest mniejsze, więc zamienimy te dwa.
Teraz 20 10 15 17 9 21
Teraz dziecko 17 jest większe niż jego rodzic 10. Zatem oba zostaną zamienione i kolejność będzie wynosić 20 17 15 10 9 21
Teraz dziecko 21 jest większe niż rodzic 15. Zatem oba zostaną zamienione.
20 17 21 10 9 15
Teraz znowu 21 jest większe niż rodzic 20. A więc 21 17 20 10 9 15
To jest Max Heap.
Teraz musimy zastosować sortowanie. Tutaj musimy zamienić pierwszy element z ostatnim i zachować właściwość Max Heap. Zatem po pierwszej zamianie: 15 17 20 10 9 21 Wyraźnie narusza to właściwość Max Heap.
Musimy więc to utrzymać. Więc porządek będzie
20 17 15 10 9 21
17 10 15 9 20 21
15 10 9 17 20 21
10 9 15 17 20 21
9 10 15 17 20 21
Tutaj podkreślona część jest częścią posortowaną.
Realizacja:
C++// C++ program for implementation // of Iterative Heap Sort #include using namespace std; // function build Max Heap where value // of each child is always smaller // than value of their parent void buildMaxHeap(int arr[] int n) { for (int i = 1; i < n; i++) { // if child is bigger than parent if (arr[i] > arr[(i - 1) / 2]) { int j = i; // swap child and parent until // parent is smaller while (arr[j] > arr[(j - 1) / 2]) { swap(arr[j] arr[(j - 1) / 2]); j = (j - 1) / 2; } } } } void heapSort(int arr[] int n) { buildMaxHeap(arr n); for (int i = n - 1; i > 0; i--) { // swap value of first indexed // with last indexed swap(arr[0] arr[i]); // maintaining heap property // after each swapping int j = 0 index; do { index = (2 * j + 1); // if left child is smaller than // right child point index variable // to right child if (arr[index] < arr[index + 1] && index < (i - 1)) index++; // if parent is smaller than child // then swapping parent with child // having higher value if (arr[j] < arr[index] && index < i) swap(arr[j] arr[index]); j = index; } while (index < i); } } // Driver Code to test above int main() { int arr[] = {10 20 15 17 9 21}; int n = sizeof(arr) / sizeof(arr[0]); printf('Given array: '); for (int i = 0; i < n; i++) printf('%d ' arr[i]); printf('nn'); heapSort(arr n); // print array after sorting printf('Sorted array: '); for (int i = 0; i < n; i++) printf('%d ' arr[i]); return 0; }
C // C program for implementation // of Iterative Heap Sort #include // function build Max Heap where value // of each child is always smaller // than value of their parent void buildMaxHeap(int arr[] int n) { for (int i = 1; i < n; i++) { // if child is bigger than parent if (arr[i] > arr[(i - 1) / 2]) { int j = i; // swap child and parent until // parent is smaller while (arr[j] > arr[(j - 1) / 2]) { int temp=arr[j]; arr[j]=arr[(j-1)/2]; arr[(j-1)/2]=temp; j = (j - 1) / 2; } } } } void heapSort(int arr[] int n) { buildMaxHeap(arr n); for (int i = n - 1; i > 0; i--) { // swap value of first indexed // with last indexed int temp=arr[0]; arr[0]=arr[i]; arr[i]=temp; // maintaining heap property // after each swapping int j = 0 index; do { index = (2 * j + 1); // if left child is smaller than // right child point index variable // to right child if (arr[index] < arr[index + 1] && index < (i - 1)) index++; // if parent is smaller than child // then swapping parent with child // having higher value if (arr[j] < arr[index] && index < i) { int tem1=arr[j]; arr[j]=arr[index]; arr[index]=tem1; } j = index; } while (index < i); } } // Driver Code to test above int main() { int arr[] = {10 20 15 17 9 21}; int n = sizeof(arr) / sizeof(arr[0]); printf('Given array: '); for (int i = 0; i < n; i++) printf('%d ' arr[i]); printf('nn'); heapSort(arr n); // print array after sorting printf('Sorted array: '); for (int i = 0; i < n; i++) printf('%d ' arr[i]); return 0; }
Java // Java implementation of Iterative Heap Sort public class HeapSort { // function build Max Heap where value // of each child is always smaller // than value of their parent static void buildMaxHeap(int arr[] int n) { for (int i = 1; i < n; i++) { // if child is bigger than parent if (arr[i] > arr[(i - 1) / 2]) { int j = i; // swap child and parent until // parent is smaller while (arr[j] > arr[(j - 1) / 2]) { swap(arr j (j - 1) / 2); j = (j - 1) / 2; } } } } static void heapSort(int arr[] int n) { buildMaxHeap(arr n); for (int i = n - 1; i > 0; i--) { // swap value of first indexed // with last indexed swap(arr 0 i); // maintaining heap property // after each swapping int j = 0 index; do { index = (2 * j + 1); // if left child is smaller than // right child point index variable // to right child if (index < (i - 1) && arr[index] < arr[index + 1]) index++; // if parent is smaller than child // then swapping parent with child // having higher value if (index < i && arr[j] < arr[index]) swap(arr j index); j = index; } while (index < i); } } public static void swap(int[] a int i int j) { int temp = a[i]; a[i]=a[j]; a[j] = temp; } /* A utility function to print array of size 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(); } // Driver program public static void main(String args[]) { int arr[] = {10 20 15 17 9 21}; int n = arr.length; System.out.print('Given array: '); printArray(arr); heapSort(arr n); System.out.print('Sorted array: '); printArray(arr); } }
Python3 # Python3 program for implementation # of Iterative Heap Sort # function build Max Heap where value # of each child is always smaller # than value of their parent def buildMaxHeap(arr n): for i in range(n): # if child is bigger than parent if arr[i] > arr[int((i - 1) / 2)]: j = i # swap child and parent until # parent is smaller while arr[j] > arr[int((j - 1) / 2)]: (arr[j] arr[int((j - 1) / 2)]) = (arr[int((j - 1) / 2)] arr[j]) j = int((j - 1) / 2) def heapSort(arr n): buildMaxHeap(arr n) for i in range(n - 1 0 -1): # swap value of first indexed # with last indexed arr[0] arr[i] = arr[i] arr[0] # maintaining heap property # after each swapping j index = 0 0 while True: index = 2 * j + 1 # if left child is smaller than # right child point index variable # to right child if (index < (i - 1) and arr[index] < arr[index + 1]): index += 1 # if parent is smaller than child # then swapping parent with child # having higher value if index < i and arr[j] < arr[index]: arr[j] arr[index] = arr[index] arr[j] j = index if index >= i: break # Driver Code if __name__ == '__main__': arr = [10 20 15 17 9 21] n = len(arr) print('Given array: ') for i in range(n): print(arr[i] end = ' ') print() heapSort(arr n) # print array after sorting print('Sorted array: ') for i in range(n): print(arr[i] end = ' ') # This code is contributed by PranchalK
C# // C# implementation of Iterative Heap Sort using System; class HeapSort { // function build Max Heap where value // of each child is always smaller // than value of their parent static void buildMaxHeap(int []arr int n) { for (int i = 1; i < n; i++) { // if child is bigger than parent if (arr[i] > arr[(i - 1) / 2]) { int j = i; // swap child and parent until // parent is smaller while (arr[j] > arr[(j - 1) / 2]) { swap(arr j (j - 1) / 2); j = (j - 1) / 2; } } } } static void heapSort(int []arr int n) { buildMaxHeap(arr n); for (int i = n - 1; i > 0; i--) { // swap value of first indexed // with last indexed swap(arr 0 i); // maintaining heap property // after each swapping int j = 0 index; do { index = (2 * j + 1); // if left child is smaller than // right child point index variable // to right child if (index < (i - 1) && arr[index] < arr[index + 1]) index++; // if parent is smaller than child // then swapping parent with child // having higher value if (index < i && arr[j] < arr[index]) swap(arr j index); j = index; } while (index < i); } } public static void swap(int[] a int i int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } /* A utility function to print array of size n */ static void printArray(int []arr) { int n = arr.Length; for (int i = 0; i < n; i++) Console.Write(arr[i] + ' '); Console.WriteLine(); } // Driver Code public static void Main(String []args) { int []arr = {10 20 15 17 9 21}; int n = arr.Length; Console.Write('Given array: '); printArray(arr); heapSort(arr n); Console.Write('Sorted array: '); printArray(arr); } } // This code is contributed by Princi Singh
JavaScript <script> // javascript program for implementation // of Iterative Heap Sort function swap(arr i j) { let temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } // function build Max Heap where value // of each child is always smaller // than value of their parent function buildMaxHeap(arr n) { for(let i=1;i<n;i++) { // if child is bigger than parent if (arr[i] > arr[(i - 1) / 2]) { let j = i; // swap child and parent until // parent is smaller while (arr[j] > arr[(j - 1) / 2]) { swap(arrj(j-1)/2); j = (j - 1) / 2; } } } } function heapSort(arr n) { buildMaxHeap(arrn); for (let i = n - 1; i > 0; i--) { // swap value of first indexed // with last indexed swap(arr0i); // maintaining heap property // after each swapping let j = 0 index; do { index = (2 * j + 1); // if left child is smaller than // right child point index variable // to right child if (arr[index] < arr[index + 1] && index < (i - 1)) index++; // if parent is smaller than child // then swapping parent with child // having higher value if (arr[j] < arr[index] && index < i) swap(arr j index); j = index; } while (index < i); } } // Driver Code to test above let arr = [10 20 15 17 9 21]; let n = arr.length; document.write('Given array : '); for (let i = 0; i < n; ++i) document.write(arr[i]+' '); document.write('
'); heapSort(arrn); // print array after sorting document.write('Sorted array : '); for (let i = 0; i < n; ++i) document.write(arr[i]+' '); // This code is contributed by aditya942003patil </script>
Wyjście
Given array: 10 20 15 17 9 21 Sorted array: 9 10 15 17 20 21
Złożoność czasowa: O(n log n) Tutaj zarówno funkcja buildMaxHeap, jak i heapSort działają w czasie O(nlogn).
Przestrzeń pomocnicza: O(1)