给定最小堆的数组表示,在 O(n) 时间内将其转换为最大堆。
例子 :
Input: arr[] = [3 5 9 6 8 20 10 12 18 9]
3
/ \
5 9
/ \ / \
6 8 20 10
/ \ /
12 18 9
Output: arr[] = [20 18 10 12 9 9 3 5 6 8] OR
[any Max Heap formed from input elements]
20
/ \
18 10
/ \ / \
12 9 9 3
/ \ /
5 6 8
乍一看,这个问题可能看起来很复杂。但我们的最终目标是只构建最大堆。这个想法很简单——我们只是简单地构建 Max Heap,而不关心输入。我们从min Heap的最底层和最右边的内部模式开始,以自下而上的方式堆化所有内部模式来构建Max堆。
下面是它的实现
C++
// A C++ program to convert min Heap to max Heap
#include
using namespace std;
// to heapify a subtree with root at given index
void MaxHeapify(int arr[], int i, int n)
{
int l = 2*i + 1;
int r = 2*i + 2;
int largest = i;
if (l < n && arr[l] > arr[i])
largest = l;
if (r < n && arr[r] > arr[largest])
largest = r;
if (largest != i)
{
swap(arr[i], arr[largest]);
MaxHeapify(arr, largest, n);
}
}
// This function basically builds max heap
void convertMaxHeap(int arr[], int n)
{
// Start from bottommost and rightmost
// internal mode and heapify all internal
// modes in bottom up way
for (int i = (n-2)/2; i >= 0; --i)
MaxHeapify(arr, i, n);
}
// A utility function to print a given array
// of given size
void printArray(int* arr, int size)
{
for (int i = 0; i < size; ++i)
printf("%d ", arr[i]);
}
// Driver program to test above functions
int main()
{
// array representing Min Heap
int arr[] = {3, 5, 9, 6, 8, 20, 10, 12, 18, 9};
int n = sizeof(arr)/sizeof(arr[0]);
printf("Min Heap array : ");
printArray(arr, n);
convertMaxHeap(arr, n);
printf("\nMax Heap array : ");
printArray(arr, n);
return 0;
}
Java
// Java program to convert min Heap to max Heap
class GFG
{
// To heapify a subtree with root at given index
static void MaxHeapify(int arr[], int i, int n)
{
int l = 2*i + 1;
int r = 2*i + 2;
int largest = i;
if (l < n && arr[l] > arr[i])
largest = l;
if (r < n && arr[r] > arr[largest])
largest = r;
if (largest != i)
{
// swap arr[i] and arr[largest]
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
MaxHeapify(arr, largest, n);
}
}
// This function basically builds max heap
static void convertMaxHeap(int arr[], int n)
{
// Start from bottommost and rightmost
// internal mode and heapify all internal
// modes in bottom up way
for (int i = (n-2)/2; i >= 0; --i)
MaxHeapify(arr, i, n);
}
// A utility function to print a given array
// of given size
static void printArray(int arr[], int size)
{
for (int i = 0; i < size; ++i)
System.out.print(arr[i]+" ");
}
// driver program
public static void main (String[] args)
{
// array representing Min Heap
int arr[] = {3, 5, 9, 6, 8, 20, 10, 12, 18, 9};
int n = arr.length;
System.out.print("Min Heap array : ");
printArray(arr, n);
convertMaxHeap(arr, n);
System.out.print("\nMax Heap array : ");
printArray(arr, n);
}
}
// Contributed by Pramod Kumar
Python3
# A Python3 program to convert min Heap
# to max Heap
# to heapify a subtree with root
# at given index
def MaxHeapify(arr, i, n):
l = 2 * i + 1
r = 2 * i + 2
largest = i
if l < n and arr[l] > arr[i]:
largest = l
if r < n and arr[r] > arr[largest]:
largest = r
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
MaxHeapify(arr, largest, n)
# This function basically builds max heap
def convertMaxHeap(arr, n):
# Start from bottommost and rightmost
# internal mode and heapify all
# internal modes in bottom up way
for i in range(int((n - 2) / 2), -1, -1):
MaxHeapify(arr, i, n)
# A utility function to print a
# given array of given size
def printArray(arr, size):
for i in range(size):
print(arr[i], end = " ")
print()
# Driver Code
if __name__ == '__main__':
# array representing Min Heap
arr = [3, 5, 9, 6, 8, 20, 10, 12, 18, 9]
n = len(arr)
print("Min Heap array : ")
printArray(arr, n)
convertMaxHeap(arr, n)
print("Max Heap array : ")
printArray(arr, n)
# This code is contributed by PranchalK
C#
// C# program to convert
// min Heap to max Heap
using System;
class GFG
{
// To heapify a subtree with
// root at given index
static void MaxHeapify(int []arr,
int i, int n)
{
int l = 2 * i + 1;
int r = 2 * i + 2;
int largest = i;
if (l < n && arr[l] > arr[i])
largest = l;
if (r < n && arr[r] > arr[largest])
largest = r;
if (largest != i)
{
// swap arr[i] and arr[largest]
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
MaxHeapify(arr, largest, n);
}
}
// This function basically
// builds max heap
static void convertMaxHeap(int []arr,
int n)
{
// Start from bottommost and
// rightmost internal mode and
// heapify all internal modes
// in bottom up way
for (int i = (n - 2) / 2; i >= 0; --i)
MaxHeapify(arr, i, n);
}
// A utility function to print
// a given array of given size
static void printArray(int []arr,
int size)
{
for (int i = 0; i < size; ++i)
Console.Write(arr[i]+" ");
}
// Driver Code
public static void Main ()
{
// array representing Min Heap
int []arr = {3, 5, 9, 6, 8,
20, 10, 12, 18, 9};
int n = arr.Length;
Console.Write("Min Heap array : ");
printArray(arr, n);
convertMaxHeap(arr, n);
Console.Write("\nMax Heap array : ");
printArray(arr, n);
}
}
// This code is contributed by nitin mittal.
PHP
$arr[$i])
$largest = $l;
if ($r < $n && $arr[$r] > $arr[$largest])
$largest = $r;
if ($largest != $i)
{
swap($arr[$i], $arr[$largest]);
MaxHeapify($arr, $largest, $n);
}
}
// This function basically builds max heap
function convertMaxHeap(&$arr, $n)
{
// Start from bottommost and rightmost
// internal mode and heapify all internal
// modes in bottom up way
for ($i = (int)(($n-2)/2); $i >= 0; --$i)
MaxHeapify($arr, $i, $n);
}
// A utility function to print a given array
// of given size
function printArray($arr, $size)
{
for ($i = 0; $i <$size; ++$i)
print($arr[$i]." ");
}
// Driver code
// array representing Min Heap
$arr = array(3, 5, 9, 6, 8, 20, 10, 12, 18, 9);
$n = count($arr);
print("Min Heap array : ");
printArray($arr, $n);
convertMaxHeap($arr, $n);
print("\nMax Heap array : ");
printArray($arr, $n);
// This code is contributed by mits
?>
Javascript
输出 :
Min Heap array : 3 5 9 6 8 20 10 12 18 9
Max Heap array : 20 18 10 12 9 9 3 5 6 8
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。